#!/usr/bin/python
# --*-- coding:utf-8 --*--
# 解决办法
import json
import logging
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.plugins.callback import CallbackBase
from collections import namedtuple
from ansible import constants as C
import ansible.executor.task_result
import multiprocessing
class ResultsCollector(CallbackBase):
def v2_runner_on_ok(self, result):
host = result._host
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y%m%d %H:%M:%S',
filename='/root/cmdb/publish.log',
filemode='a'
)
logging.info('===v2_runner_on_ok===host=%s===result=%s' % (host, result._result))
print("run on ok")
def v2_playbook_on_no_hosts_matched(self):
self.output = "skipping: No match hosts."
def v2_playbook_on_no_hosts_remaining(self):
print('remaining')
def v2_playbook_on_task_start(self, task, is_conditional):
print('task start',task)
def v2_playbook_on_play_start(self, play):
print('play start',play)
def v2_playbook_on_stats(self, stats):
print('stats',stats)
# print(json.dumps({host.name: result._result}, indent=4))
def v2_runner_on_failed(self, result, ignore_errors=False):
host = result._host
logging.warning('===v2_runner_on_failed====host=%s===result=%s' % (host, result._result))
def v2_runner_on_unreachable(self, result):
host = result._host
logging.warning('===v2_runner_on_unreachable====host=%s===result=%s' % (host, result._result))
class AnsibleAPI(object):
def __init__(self, hostlist, image_name, playbooks, *args, **kwargs):
self.playbooks = playbooks
self.passwords = None
self.callback = None
Options = namedtuple('Options',
['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass', 'module_path',
'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks',
'listtags', 'syntax', 'sudo_user', 'sudo', 'diff'])
self.options = Options(connection='smart', remote_user='root', ack_pass=None, sudo_user='root', forks=5,
sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None, become=True,
become_method='sudo', become_user='root', check=None, listhosts=False, listtasks=False,
listtags=None, syntax=None, diff=False)
self.loader = DataLoader()
self.inventory = InventoryManager(loader=self.loader, sources=['/etc/ansible/hosts'])
self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)
self.variable_manager.extra_vars = {"image_name": image_name, 'host': hostlist}
def runplaybook(self):
playbook = PlaybookExecutor(
playbooks=self.playbooks,
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
options=self.options,
passwords=None)
playbook._tqm._stdout_callback = ResultsCollector()
playbook.run()
if __name__ == '__main__':
# 创建对象
an1 = AnsibleAPI('192.168.188.200,192.168.188.200', 'test1.py', ['/etc/ansible/myplay.yaml'])
# an2 = AnsibleAPI('192.168.194.128','common-oss-dc3a25.tar',['/etc/ansible/myplay.yaml'])
# processes = []
p1 = multiprocessing.Process(name='process_one', target=an1.runplaybook)
# p2 = multiprocessing.Process(name='process_two',target=an1.runplaybook)
# processes.append(p1)
# processes.append(p2)
# for p in processes:
# p.start()
# 等待子进程结束,主进程退出
# for p in processes:
# p.join() #可以加浮点数参数,等待多久就不等了
p1.start()
if p1.is_alive():
print('正在发布')
p1.join()
if not p1.is_alive():
print('发布结束')