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_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

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值