執行adhoc
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from collections import namedtuple # 核心類 # 用於讀取YAML和JSON格式的文件 from ansible.parsing.dataloader import DataLoader # 用於存儲各類變量信息 from ansible.vars.manager import VariableManager # 用於導入資產文件 from ansible.inventory.manager import InventoryManager # 操作單個主機信息 from ansible.inventory.host import Host # 操作單個主機組信息 from ansible.inventory.group import Group # 存儲執行hosts的角色信息 from ansible.playbook.play import Play # ansible底層用到的任務隊列 from ansible.executor.task_queue_manager import TaskQueueManager # 核心類執行playbook from ansible.executor.playbook_executor import PlaybookExecutor def adhoc(): """ ad-hoc 調用 資產配置信息 這個是通過 InventoryManager和VariableManager 定義 執行選項 這個是通過namedtuple來定義 執行對象和模塊 通過dict()來定義 定義play 通過Play來定義 最后通過 TaskQueueManager 的實例來執行play :return: """ # 資產配置信息 dl = DataLoader() im = InventoryManager(loader=dl, sources=["hosts"]) vm = VariableManager(loader=dl, inventory=im) # 執行選項,這個類不是ansible的類,這個的功能就是為了構造參數 Options = namedtuple("Options", [ "connection", "remote_user", "ask_sudo_pass", "verbosity", "ack_pass", "module_path", "forks", "become", "become_method", "become_user", "check", "listhosts", "listtasks", "listtags", "syntax", "sudo_user", "sudo", "diff" ]) """ 這里就是Options的實例,然后你就可以賦值,這個為了給ansible設置執行選項 ansibile 172.16.48.171 -m shell -a 'ls /tmp' -f 5 這里的選項就是ansible命令中 -f -C -D -m等執行選項 """ options = Options(connection='smart', remote_user=None, ack_pass=None, sudo_user=None, forks=5, sudo=None, ask_sudo_pass=False, verbosity=5, module_path=None, become=None, become_method=None, become_user=None, check=False, diff=False, listhosts=None, listtasks=None, listtags=None, syntax=None) # play的執行對象和模塊,這里設置hosts,其實是因為play把play_source和資產信息關聯后,執行的play的時候它會去資產信息中設置的sources的hosts文件中 # 找你在play_source中設置的hosts是否在資產管理類里面。 play_source = dict(name="Ansible Play", # 任務名稱 hosts="172.16.48.242", # 目標主機,可以填寫具體主機也可以是主機組名稱 gather_facts="no", # 是否收集配置信息 # tasks是具體執行的任務,列表形式,每個具體任務都是一個字典 tasks=[ dict(action=dict(module="shell", args="ls /tmp")) ]) # 定義play play = Play().load(play_source, variable_manager=vm, loader=dl) passwords = dict() # 這個可以為空,因為在hosts文件中 # tqm = TaskQueueManager( inventory=im, variable_manager=vm, loader=dl, options=options, passwords=passwords, ) result = tqm.run(play) print(result) def main(): adhoc() if __name__ == "__main__": try: main() finally: sys.exit()
執行playbook
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from collections import namedtuple # 核心類 # 用於讀取YAML和JSON格式的文件 from ansible.parsing.dataloader import DataLoader # 用於存儲各類變量信息 from ansible.vars.manager import VariableManager # 用於導入資產文件 from ansible.inventory.manager import InventoryManager # 操作單個主機信息 from ansible.inventory.host import Host # 操作單個主機組信息 from ansible.inventory.group import Group # 存儲執行hosts的角色信息 from ansible.playbook.play import Play # ansible底層用到的任務隊列 from ansible.executor.task_queue_manager import TaskQueueManager # 核心類執行playbook from ansible.executor.playbook_executor import PlaybookExecutor def execplaybook(): """ 調用 playbook 調用playboo大致和調用ad-hoc相同,只是真正調用的是使用PlaybookExecutor :return: """ # 資產配置信息 dl = DataLoader() im = InventoryManager(loader=dl, sources=["hosts"]) vm = VariableManager(loader=dl, inventory=im) # 執行選項,這個類不是ansible的類,這個的功能就是為了構造參數 Options = namedtuple("Options", [ "connection", "remote_user", "ask_sudo_pass", "verbosity", "ack_pass", "module_path", "forks", "become", "become_method", "become_user", "check", "listhosts", "listtasks", "listtags", "syntax", "sudo_user", "sudo", "diff" ]) """ 這里就是Options的實例,然后你就可以賦值,這個為了給ansible設置執行選項 ansibile 172.16.48.171 -m shell -a 'ls /tmp' -f 5 這里的選項就是ansible命令中 -f -C -D -m等執行選項 """ options = Options(connection='smart', remote_user=None, ack_pass=None, sudo_user=None, forks=5, sudo=None, ask_sudo_pass=False, verbosity=5, module_path=None, become=None, become_method=None, become_user=None, check=False, diff=False, listhosts=None, listtasks=None, listtags=None, syntax=None) passwords = dict() # 這個可以為空,因為在hosts文件中 # try: # playbooks參數里面放的就是playbook文件路徑 playbook = PlaybookExecutor(playbooks=["f1.yml"], inventory=im, variable_manager=vm, loader=dl, options=options, passwords=passwords) playbook.run() except Exception as err: print(err) def main(): execplaybook() if __name__ == "__main__": try: main() finally: sys.exit()
下圖為f1.yml