python调用AnsibleAPI接口供django后台中使用

安装ansible:/usr/local/python36/bin/pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com ansible

vim AnsibleAPI.py

#!/usr/bin/env python
# 官网地址:https://docs.ansible.com/ansible/latest/dev_guide/developing_api.html
# 还没有实际引入boamp项目种使用

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

# 创建一个回调插件,这样我们就可以捕获输出
class ResultsCollectorJSONCallback(CallbackBase):
    """
    一个示例回调插件,用于在收到结果时执行操作。
    如果要将所有结果收集到单个对象中,以便在
    在执行结束时,查看如何使用``json``回调插件
    或者编写自己的自定义回调插件。
    """

    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
        print(json.dumps({host.name: result._result}, indent=4))

    def v2_runner_on_ok(self, result, *args, **kwargs):
        """
        打印结果的json表示形式。
        此外,将结果存储在实例属性中,以便以后检索
        """
        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
        print(json.dumps({host.name: result._result}, indent=4))


def Ansible_API(host_ip, host_cmd):
    """
    调用ansible api
    :param host_ip: 执行主机ip
    :param cmd_list: 对该主机执行的命令
    :return:
    """
    host_list = []
    host_list.append(host_ip)
    # 由于API是为CLI构建的,因此它希望在上下文对象中始终设置某些选项
    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, verbosity=0)
    # 取得 localhost,xxx 格式的sources
    # https://github.com/ansible/ansible/blob/devel/lib/ansible/inventory/manager.py#L204
    sources = ','.join(host_list)
    if len(host_list) == 1:
        sources += ','

    # 初始化所需的对象
    loader = DataLoader()  # 负责查找和读取yaml、json和ini文件
    # 密码这里是必须使用的一个参数,假如通过了公钥信任,也可以给一个空字典
    # passwords = dict(vault_pass='secret')
    passwords = dict()

    # 实例化我们的ResultCollectorJSonCallback,以便在结果出现时进行处理。Ansible预计这将是其主要展示渠道之一
    results_callback = ResultsCollectorJSONCallback()

    # 创建资源清册,以逗号分隔的字符串将配置文件的路径作为源或主机
    inventory = InventoryManager(loader=loader, sources=sources)

    # 变量管理器负责合并所有不同的源,为您提供每个上下文中可用变量的统一视图
    variable_manager = VariableManager(loader=loader, inventory=inventory)

    # 实例化任务队列管理器,它负责分叉和设置所有对象,以便在主机列表和任务上迭代
    # 重要提示:这还会将库dirs路径添加到模块加载器
    # 重要提示:因此必须在调用“Play”之前对其进行初始化。加载()。
    tqm = TaskQueueManager(
        inventory=inventory,
        variable_manager=variable_manager,
        loader=loader,
        passwords=passwords,
        stdout_callback=results_callback,  # 使用我们的自定义回调,而不是打印到stdout的``default``回调插件
    )

    # 创建代表我们的游戏的数据结构,包括任务,这基本上是我们的YAML加载器在内部所做的。
    play_source = dict(
        name="Ansible Play",
        hosts=host_list,
        gather_facts='no',
        tasks=[
            dict(action=dict(module='shell', args=host_cmd), register='shell_out'),
        ]
    )

    # 创建play对象,playbook对象使用。加载而不是初始化或新方法,
    # 这也将根据play_source中提供的信息自动创建任务对象
    play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

    # 实际运行它
    try:
        result = tqm.run(play)  # 一个剧本中最有趣的数据实际上被发送到回调函数的方法中
    finally:
        # 我们总是需要清理子进程以及我们用来与它们通信的结构
        tqm.cleanup()
        if loader:
            loader.cleanup_all_tmp_files()

    # 移除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']))


Ansible_API("118.xxx.xxx.xxx", "df -h")

 

posted @ 2022-03-17 15:00  chenjianwen  阅读(786)  评论(0编辑  收藏  举报