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_runner
def 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 command
hosts: all
gather_facts: no
become_method: sudo
tasks:
- name: Run a shell command1
shell: echo "!!!!!!!!!!!!!"
- name: Run a shell command2
shell: for i in {1..5};do sleep 1 && echo $i;done
- name: Run a shell command3
shell: lll