Ansible的Python API


bash;gutter:true;</p> <h1>!/usr/bin/env python</h1> <p>from <strong>future</strong> import (absolute_import, division, print_function) <strong>metaclass</strong> = type</p> <p>import json import shutil</p> <p>import ansible.constants as C from ansible.executor.task_queue_manager import TaskQueueManager from ansible.module_utils.common.collections import ImmutableDict from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader from import Play from ansible.plugins.callback import CallbackBase from ansible.vars.manager import VariableManager from ansible import context</p> <h1>Create a callback plugin so we can capture the output</h1> <p>class ResultsCollectorJSONCallback(CallbackBase): """A sample callback plugin used for performing an action as results come in.</p> <pre><code>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. </code></pre> <p>"""</p> <pre><code>def __init__(self, *args, **kwargs): super(ResultsCollectorJSONCallback, self).__init__(*args, **kwargs) self.host_ok = {} self.host_unreachable = {} self.host_failed = {} def v2_runner_on_unreachable(self, result): host = result._host self.host_unreachable[host.get_name()] = result def v2_runner_on_ok(self, result, *args, **kwargs): """Print a json representation of the result. Also, store the result in an instance attribute for retrieval later </code></pre> <p>""" host = result._host self.host_ok[host.get_name()] = result print(json.dumps({ result._result}, indent=4))</p> <pre><code>def v2_runner_on_failed(self, result, *args, **kwargs): host = result._host self.host_failed[host.get_name()] = result </code></pre> <p>def main(): host_list = [''] # since the API is constructed for CLI it expects certain options to always be set in the context object # context.CLIARGS = ImmutableDict(connection='smart', module_path=['/to/mymodules', '/usr/share/ansible'], forks=10, become=None, # become_method=None, become_user=None, check=False, diff=False)</p> <pre><code>context.CLIARGS = ImmutableDict(connection='paramiko_ssh', module_path=[], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False, syntax=False, start_at_task=None) # required for # sources = ','.join(host_list) if len(host_list) == 1: sources += ',' # initialize needed objects loader = DataLoader() # Takes care of finding and reading yaml, json and ini files passwords = dict(vault_pass='secret') # Instantiate our ResultsCollectorJSONCallback for handling results as they come in. Ansible expects this to be one of its main display outlets results_callback = ResultsCollectorJSONCallback() # create inventory, use path to host config file as source or hosts in a comma separated string inventory = InventoryManager(loader=loader, sources=sources) # variable manager takes care of merging all the different sources to give you a unified view of variables available in each context variable_manager = VariableManager(loader=loader, inventory=inventory) # instantiate task queue manager, which takes care of forking and setting up all objects to iterate over host list and tasks # IMPORTANT: This also adds library dirs paths to the module loader # IMPORTANT: and so it must be initialized before calling .load(). tqm = TaskQueueManager( inventory=inventory, variable_manager=variable_manager, loader=loader, passwords=passwords, stdout_callback=results_callback, # Use our custom callback instead of the default callback plugin, which prints to stdout ) # create data structure that represents our play, including tasks, this is basically what our YAML loader does internally. play_source = dict( name="Ansible Play", hosts=host_list, gather_facts='no', tasks=[ dict(action=dict(module='shell', args='ls'), register='shell_out'), dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}'))), dict(action=dict(module='command', args=dict(cmd='/usr/bin/uptime'))), ] ) # Create play object, playbook objects use .load instead of init or new methods, # this will also automatically create the task objects from the info provided in play_source play = Play().load(play_source, variable_manager=variable_manager, loader=loader) # Actually run it try: result = # most interesting data for a play is actually sent to the callback's methods finally: # we always need to cleanup child procs and the structures we use to communicate with them tqm.cleanup() if loader: loader.cleanup_all_tmp_files() # Remove ansible tmpdir shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) print("UP ***********") for host, result in results_callback.host_ok.items(): print('{0} >>> {1}'.format(host, result._result['stdout'])) print("FAILED *******") for host, result in results_callback.host_failed.items(): print('{0} >>> {1}'.format(host, result._result['msg'])) print("DOWN *********") for host, result in results_callback.host_unreachable.items(): print('{0} >>> {1}'.format(host, result._result['msg'])) </code></pre> <p>if <strong>name</strong> == '<strong>main</strong>': main()

Author: 头痛不头痛
Title: Ansible的Python API











最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总