zoukankan      html  css  js  c++  java
  • Ansible的Python API

    Python的API

    #!/usr/bin/env python
    
    from __future__ import (absolute_import, division, print_function)
    __metaclass__ = type
    
    import json
    import shutil
    
    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 ansible.playbook.play import Play
    from ansible.plugins.callback import CallbackBase
    from ansible.vars.manager import VariableManager
    from ansible import context
    
    
    # Create a callback plugin so we can capture the output
    class ResultsCollectorJSONCallback(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 __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
            """
            host = result._host
            self.host_ok[host.get_name()] = result
            print(json.dumps({host.name: result._result}, indent=4))
    
        def v2_runner_on_failed(self, result, *args, **kwargs):
            host = result._host
            self.host_failed[host.get_name()] = result
    
    
    def main():
        host_list = ['192.168.0.31']
        # 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)
    
        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
        # https://github.com/ansible/ansible/blob/devel/lib/ansible/inventory/manager.py#L204
        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 `Play.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 = tqm.run(play)  # 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']))
    
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    [LeetCode] 1131. Maximum of Absolute Value Expression 绝对值表达式的最大值
    [LeetCode] 1130. Minimum Cost Tree From Leaf Values 叶值的最小代价生成树
    [LeetCode] 1129. Shortest Path with Alternating Colors 颜色交替的最短路径
    [LeetCode] 1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量
    [LeetCode] 1125. Smallest Sufficient Team 最小的必要团队
    [LeetCode] 1124. Longest Well-Performing Interval 表现良好的最长时间段
    [LeetCode] 1122. Relative Sort Array 数组的相对排序
    Gitalk 自动初始化评论
    [LeetCode] 1111. Maximum Nesting Depth of Two Valid Parentheses Strings 有效括号的嵌套深度
    [LeetCode] 1110. Delete Nodes And Return Forest 删点成林
  • 原文地址:https://www.cnblogs.com/zydev/p/13852623.html
Copyright © 2011-2022 走看看