[转载]ansible 2.4+接口

 

#!/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('发布结束')

 

posted @ 2018-08-18 23:26  EngineTang  阅读(228)  评论(0编辑  收藏  举报