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")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM