ansible 2.7 API
# coding:utf-8 # @Time : 2019-01-14 15:22 # @Author : 小贰 # @FileName: ansible_sync_hosts.py # @function: About ansible 2.7 API import json from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.playbook.play import Play from ansible.executor.task_queue_manager import TaskQueueManager from ansible.plugins.callback import CallbackBase class ResultsCollector(CallbackBase): """重构执行结果""" def __init__(self, *args, **kwargs): super(ResultsCollector, self).__init__(*args, **kwargs) self.host_ok = {} self.host_unreachable = {} self.host_failed = {} def v2_runner_on_unreachable(self, result, *args, **kwargs): """不可达""" self.host_unreachable[result._host.get_name()] = result def v2_runner_on_ok(self, result, *args, **kwargs): """执行成功""" self.host_ok[result._host.get_name()] = result def v2_runner_on_failed(self, result, *args, **kwargs): """执行失败""" self.host_failed[result._host.get_name()] = result def run_ansible(module_name,module_args,host_list,option_dict): # 初始化需要的对象 Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'private_key_file','become_user', 'remote_user', 'check', 'diff'] ) #负责查找和读取yaml、json和ini文件 loader = DataLoader() options = Options(connection='ssh', module_path=None, forks=5, become=option_dict['become'], become_method='sudo',private_key_file="/root/.ssh/id_rsa", become_user='root', remote_user=option_dict['remote_user'], check=False, diff=False ) passwords = dict(vault_pass='secret') # 实例化ResultCallback来处理结果 callback = ResultsCollector() # 创建库存(inventory)并传递给VariableManager inventory = InventoryManager(loader=loader, sources=['/etc/ansible/hosts']) variable_manager = VariableManager(loader=loader, inventory=inventory) # 创建任务 host = ",".join(host_list) play_source = dict( name="Ansible Play", hosts=host, gather_facts='no', tasks=[ dict(action=dict(module=module_name, args=module_args), register='shell_out'), ] ) play = Play().load(play_source, variable_manager=variable_manager, loader=loader) # 开始执行 tqm = None tqm = TaskQueueManager( inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords, stdout_callback=callback, ) result = tqm.run(play) result_raw = {'success': {}, 'failed': {}, 'unreachable': {}} for host, result in callback.host_ok.items(): result_raw['success'][host] = result._result['stdout_lines'] for host, result in callback.host_failed.items(): result_raw['failed'][host] = result._result['stderr_lines'] for host, result in callback.host_unreachable.items(): result_raw['unreachable'][host] = result._result["msg"] return json.dumps(result_raw, indent=4) if __name__ == "__main__": option_dict={"become":True,"remote_user":"opadmin"} module_name = 'shell' module_args = "ls /root" host_list = ['192.168.1.191','192.168.1.190'] ret = run_ansible(module_name,module_args,host_list,option_dict) print(ret)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析