summaryrefslogtreecommitdiff
path: root/src/caas/services/ansibleservice.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/caas/services/ansibleservice.py')
-rw-r--r--src/caas/services/ansibleservice.py52
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)