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