您的位置:首页 > 科技 > 能源 > python异步调用ansible sdk

python异步调用ansible sdk

2024/11/19 2:11:29 来源:https://blog.csdn.net/litaimin/article/details/140769591  浏览:    关键词:python异步调用ansible sdk

1、背景:

最近有个需求,运维平台(python+vue开发的)需要做一个批量任务功能,打算采用ansible_runner这个sdk去实现。然后发现网上关于这个sdk的说明太模糊了,根本不具备参考价值

2、教程:

注意事项
1、这个sdk只能在linux环境运行
2、需要在linux环境中部署ansible

首先通过查看这个包,可以发现有好几个方法

run                  ## 运行playbook
run_async      ## 异步运行playbook
run_command   ## 运行命令
run_command_async   ## 异步运行命令
get_plugin_docs    ##获取模块的说明文档,和ansible-doc相似
get_plugin_docs_async  ##异步获取模块的说明文档
get_plugin_list  ##获取模块列表
get_role_list  ##获取角色模块列表
get_role_argspec  #用于获取特定角色(role)的参数规范
get_inventory  ##获取inventory
get_ansible_config  ##获取配置

可以看到 其实主要分为两大类,同步和异步

下面用run、run_async 两个方法来举例:

run: 同步执行,调用该方法后会阻塞,直到 playbook 执行完成;执行结果一次性返回
run_async:异步执行,调用该方法后不会阻塞,playbook 会在后台运行;实时执行结果

选型:由于在生产中我们往往需要并发执行多种任务,且需要实时观测执行的进度,所以采用run_async方法做开发

3、案例:

功能需求:前端选择 需要执行的playbook,选择需要执行的主机,然后运行任务,并且实时返回结果。

由于这个功能设计到的代码比较多,所以这里介绍了一个简单的demo

import ansible_runnerdef run_playbook(playbook_name, hosts, username, password):# 工作目錄data_dir = "/tmp/demo"# 设置环境变量envvars = {"ANSIBLE_FORKS": 1,}inventory = {"all": {"hosts": {host: {"ansible_user": username,"ansible_password": password} for host in hosts}}}# 运行 Ansible playbook 异步thread,runner = ansible_runner.run_async(private_data_dir=data_dir,playbook=playbook_name,inventory=inventory,quiet=True,envvars=envvars)# 处理并打印事件日志try:for event in runner.events:if 'stdout' in event and event['stdout']:print(event['stdout'])except Exception as e:raise Exception(f"Playbook execution failed: {str(e)}")# 等待线程完成thread.join()# 检查最终状态if runner.rc != 0:raise Exception(f"Playbook execution failed: {runner.rc}")# 示例主机列表
hosts = ['10.10.100.100', '10.10.100.101']
username = 'ops'
password = '123456'playbook_path="/opt/ansible-api/example_playbook.yml"# 运行 playbook 并打印日志
try:run_playbook(playbook_path, hosts, username, password)
except Exception as e:print(f"Error: {e}")

example_playbook.yml

---
- name: Execute a simple shell commandhosts: allgather_facts: nobecome_method: sudotasks:- name: Run a shell command1shell: echo "!!!!!!!!!!!!!"- name: Run a shell command2shell: for i in {1..5};do sleep 1 && echo $i;done- name: Run a shell command3shell: lll

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com