summaryrefslogtreecommitdiff
path: root/src/caas/services/ansibleservice.py
blob: 148bcf4c48d2f755248c9ed576fe5364211bcdf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from django.conf import settings
import json
import zmq
import logging


logger = logging.getLogger("caas")


"""
Superclass for classes that manage ansible playbooks, for example
icinga and wr-installer.
"""
class AnsibleService():
    def __init__(self, ansible_queue, target, git, branch, playbook, zmq, maint_window_p = False):
        self.ansible_queue = ansible_queue
        self.target = target
        self.git = git
        self.branch = branch
        self.playbook = playbook
        self.zmq = zmq
        self.maint_window_p = maint_window_p

    def run_playbook(self, inventory, inventory_content, hostvars, hostvars_content, extra_args = {}):
        payload = [{"git": self.git,
                    "playbook": self.playbook,
                    "maintWindowP": self.maint_window_p,
                    "inventory": inventory,
                    "inventoryContent": inventory_content,
                    "hostvars": hostvars,
                    "hostvarsContent": hostvars_content}]
        payload[0].update(extra_args)
        payload_json = json.dumps(payload)
        context = zmq.Context()
        retries = 10
        while True:
            socket = context.socket(zmq.REQ)
            if settings.ZEROMQ_IPV6:
                socket.setsockopt(zmq.IPV6, 1)
            # logger.debug("sending playbook: %s" % payload_json)
            socket.connect(self.zmq)
            socket.send_string(payload_json)
            logger.debug("sent playbook")
            if (socket.poll(5000) & zmq.POLLIN) != 0:
                return socket.recv()
            retries -= 1
            socket.setsockopt(zmq.LINGER, 0)
            socket.close()
            if retries == 0:
                errmsg = "Failed to send zmq message to ansible-queue: %s" % payload_json
                logger.error(errmsg)
                raise Exception(errmsg)