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)