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)
|