diff options
Diffstat (limited to 'src/caas/services/ansibleservice.py')
| -rw-r--r-- | src/caas/services/ansibleservice.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/caas/services/ansibleservice.py b/src/caas/services/ansibleservice.py new file mode 100644 index 0000000..148bcf4 --- /dev/null +++ b/src/caas/services/ansibleservice.py @@ -0,0 +1,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) |
