ansible playbook API得到任务执行返回结果,ansibleplaybook
ansible playbook API得到任务执行返回结果,ansibleplaybook
1. ansisble2.x playbook api与ansible1.9.x的相差很大,而且直观看来配置复杂多了 2.以下案例是通过loggin打印出来ansible模块执行结果,如若需要得到,可以加入中间件,如rabbitmq,将消息publish出去,另一处消费该消息即可 (1) ansible1.9.x playbook api
#!/usr/bin/env python # coding=utf-8 import ansible.runner import logging from ansible.playbook import PlayBook from ansible.inventory import Inventory from ansible import callbacks from ansible import utils from ansible import callbacks class PlaybookRunnerCallbacks(callbacks.PlaybookRunnerCallbacks): def __init__(self, stats, verbose=None): super(PlaybookRunnerCallbacks, self).__init__(stats, verbose) def on_ok(self, host, host_result): super(PlaybookRunnerCallbacks, self).on_ok(host, host_result) logging.warning('===on_ok====host=%s===result=%s'%(host,host_result)) def on_unreachable(self, host, results): super(PlaybookRunnerCallbacks, self).on_unreachable(host, results) logging.warning('===on_unreachable====host=%s===result=%s'%(host,results)) def on_failed(self, host, results, ignore_errors=False): super(PlaybookRunnerCallbacks, self).on_failed(host, results, ignore_errors) logging.warning('===on_unreachable====host=%s===result=%s'%(host,results)) def on_skipped(self, host, item=None): super(PlaybookRunnerCallbacks, self).on_skipped(host, item) logging.warning("this task does not execute,please check parameter or condition.") class PlaybookCallbacks(callbacks.PlaybookCallbacks): def __init__(self,verbose=False): super(PlaybookCallbacks, self).__init__(verbose) def on_stats(self, stats): super(PlaybookCallbacks, self).on_stats( stats) logging.warning("palybook executes completed====") hosts = ['127.0.0.1', '192.168.234.3'] inventory = Inventory(hosts) stats = callbacks.AggregateStats() runner_cb = PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) playbook_cb = PlaybookCallbacks() res=ansible.playbook.PlayBook( playbook='/tmp/playbook.yaml', stats=stats, callbacks=playbook_cb, runner_callbacks=runner_cb, inventory=inventory, forks=200 ) result = res.run() playbook_cb.on_stats(res.stats)
2. ansible2 playbook api
#!/usr/bin/env python # coding=utf-8 import json import logging from ansible.parsing.dataloader import DataLoader from ansible.vars import VariableManager from ansible.inventory import Inventory 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 class ResultsCollector(CallbackBase): def __init__(self,*args, **kwargs): super(ResultsCollector, self).__init__(*args, **kwargs) def _get_return_data(self, result): try: if result.get('msg',None): return_data= result.get('msg') elif result.get('stderr',None): return_data= result.get('stderr') else: return_data = result except: pass return return_data.encode('utf-8') def v2_runner_on_ok(self, result): host = result._host.get_name() self.runner_on_ok(host, result._result) logging.warning('===v2_runner_on_ok====host=%s===result=%s'%(host,result._result)) def v2_runner_on_failed(self, result, ignore_errors=False): host = result._host.get_name() self.runner_on_failed(host, result._result, ignore_errors) return_data = self._get_return_data(result._result) logging.warning('===v2_runner_on_failed====host=%s===result=%s'%(host,return_data)) def v2_runner_on_unreachable(self, result): host = result._host.get_name() self.runner_on_unreachable(host, result._result) return_data = self._get_return_data(result._result) logging.warning('===v2_runner_on_unreachable====host=%s===result=%s'%(host,return_data)) def v2_runner_on_skipped(self, result): if C.DISPLAY_SKIPPED_HOSTS: host = result._host.get_name() self.runner_on_skipped(host, self._get_item(getattr(result._result,'results',{}))) logging.warning("this task does not execute,please check parameter or condition.") def v2_playbook_on_stats(self, stats): logging.warning('===========palybook executes completed========') loader = DataLoader() variable_manager = VariableManager() inventory = Inventory(loader = loader, variable_manager = variable_manager, host_list = ['127.0.0.1', '192.168.234.3']) variable_manager.set_inventory(inventory) variable_manager.extra_vars={"ansible_ssh_user":"root"} #额外参数,包括playbook参数 key:value 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']) options = Options( connection='smart', remote_user='root', ack_pass=None, sudo_user='root', forks=200, sudo='yes', ask_sudo_pass=False, verbosity=5, module_path=None, become=True, become_method='su', become_user='root', check=None, listhosts=None, listtasks=None, listtags=None, syntax=None) playbook = PlaybookExecutor(playbooks=['/tmp/playbook.yaml'], inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=None) playbook._tqm._stdout_callback = ResultsCollector() res = playbook.run()
评论暂时关闭