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")
一些事情一直在干,说不定以后就结果了呢
本文来自博客园,作者:chenjianwen,转载请注明原文链接:https://www.cnblogs.com/chenjw-note/p/16017286.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用