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