1. 程式人生 > 其它 >python呼叫AnsibleAPI介面供django後臺中使用

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