官方文檔見 http://docs.ansible.com/ansible/dev_guide/developing_api.htmlhtml
拿官方的例子修改以下web
import json from collections import namedtuple 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.task_result import TaskResult from ansible.plugins.callback import CallbackBase # 自定義 callback,即在運行 api 後調用本類中的 v2_runner_on_ok(),在這裏會輸出 host 和 result 格式 class ResultCallback(CallbackBase): """A sample callback plugin used for performing an action as results come in If you want to collect all results into a single object for processing at the end of the execution, look into utilizing the ``json`` callback plugin or writing your own custom callback plugin """ def v2_runner_on_ok(self, result, **kwargs): """Print a json representation of the result This method could store the result in an instance attribute for retrieval later """ # result 包含'_check_key', '_host', '_result', '_task', 'is_changed', 'is_failed', 'is_skipped', 'is_unreachable' host = result._host print json.dumps({host.name: result._result}, indent=4) """ def v2_on_any(self, *args, **kwargs): if isinstance(args[0], TaskResult): print json.dumps({args[0]._host.name: args[0]._result}, indent=4) """ Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check']) # initialize needed objects variable_manager = VariableManager() loader = DataLoader() options = Options(connection='smart', module_path=None, forks=100, become=None, become_method=None, become_user=None, check=False) passwords = dict(conn_pass='mypassword') # 目前只發現有兩個key,conn_pass, become_pass # Instantiate our ResultCallback for handling results as they come in results_callback = ResultCallback() # create inventory and pass to var manager inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='hosts')
# hosts文件,也能夠是 ip列表 '10.1.162.18:322, 10.1.167.36' 或者 ['10.1.162.18:322', '10.1.167.36'] variable_manager.set_inventory(inventory) # create play with tasks play_source = dict( name = "Ansible Play", hosts = 'web', # 對應 playbook 入口yaml文件的 hosts變量,也能夠是 ip 10.1.162.18 gather_facts = 'no', tasks = [ dict(action=dict(module='shell', args='ifconfig'), register='shell_out'), #dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}'))) ] ) play = Play().load(play_source, variable_manager=variable_manager, loader=loader) # actually run it # TaskQueueManager 是建立進程池,負責輸出結果和多進程間數據結構或者隊列的共享協做 tqm = None try: tqm = TaskQueueManager( inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords, stdout_callback=results_callback, # Use our custom callback instead of the ``default`` callback plugin # 若是註釋掉 callback 則會調用原生的 DEFAULT_STDOUT_CALLBACK,輸出 task result的output,同 ansible-playbook debug ) result = tqm.run(play) print result # 返回碼,只要有一個 host 出錯就會返回 非0 數字 finally: if tqm is not None: tqm.cleanup()
若是須要統一輸出能夠重寫 shell
v2_runner_on_failed(self, result, ignore_errors=False)
v2_runner_on_ok(self, result)
v2_runner_on_skipped(self, result)
v2_runner_on_unreachable(self, result)
v2_runner_on_no_hosts(self, task)
具體能夠參考 plugins/callback/__init__.py