Python使用ansible-runner模块实现ansible调用学习

在很早之前学习 Ansible 时,使用官网的 ansible 模块,自己封装过简单的脚本接口,实现Python执行 playbook 和 AdHoc, 详细可以参考 Python Ansible API 实战


今天在网上看到一个开源的Python模块调用ansible,比起自己写的强的很多。它提供了更高级别的接口和功能,使得在应用程序中集成和使用Ansible变得更加便捷。

这里就带领大家熟悉 Ansible Runner的使用,包括安装、配置和基本操作。

1. 安装和基本介绍

首先,确保您的系统已经安装了Python,并且具备pip包管理工具。使用以下命令来安装Ansible Runner:

pip install ansible-runner

安装 Ansible Runner 之后,它提供两种调用方式

  • 第一种 类似ansible命令一样会在服务器上有个ansible-runner的命令,可以基于命令行来执行

  • 第二种就是在Python程序中调用ansible-runner的API接口

这里先介绍的 基于命令行的 ansible-runner 的基本用法

1、ansible-runner 常用的命令有 run/start/stop/is-alive

其中 run 是在前台启动 ansible-runner,并等待底层Ansible进程完成后返回

start 是在后台ansible-runner,可以使用 is-alive 检查该后台进程,或者使用 stop 来停止该后台进程

2、不管是那种默认执行 ansible-runner,都会生产 artifacts 目录, 该目录下存放ansible-runner执行的结果、状态等, 可以通过 -i 参数来指定目录,不然的默认是在<private_data_dir>/artifacts

3、如上执行的时候需要明确指定一个 private_data_dir 目录,该目录下会放置ansible-runner metadata信息,比如inventory、project 、env等

2. 配置Ansible Runner

这里我们先介绍第一个种用法,在开始使用之前,需要先进行一些配置工作

Ansible Runner的配置通常包括两个部分:环境变量和配置文件。

  • 环境变量用于指定Ansible Runner的运行环境和选项

  • 配置文件包含更详细的配置信息

设置环境变量

# ansible 的全局配置文件
export ANSIBLE_CONFIG=/opt/app/ansible-runner/etc/ansible.cfg
# ansible-runner 运行时配置
export ANSIBLE_RUNNER_CONFIG=/opt/app/ansible-runner/runner.yml

创建配置文件ansible.cfg:

[defaults]
host_key_checking = False
inventory = /path/to/inventory.ini

创建配置文件runner.yml:

---
ansible_runner:
  # 必须配置项
  private_data_dir: /opt/app/ansible-runner/
  # 如果不配置artifact_dir,会在 private_data_dir 目录下自动创建 artifacts目录
  artifact_dir: /opt/app/ansible-runner/artifacts
  rotate_artifacts: 10

3. 运行Ansible Playbook

使用Ansible Runner来运行Ansible Playbook非常简单。

在项目目录下创建一个名为main.yml的Ansible Playbook文件,然后使用以下命令运行Playbook:

ansible-runner run /opt/app/ansible-runner/ -p main.yml

这将使用Ansible Runner来执行指定项目目录下的Playbook。

注意:实际测试中在不使用 -m(指定模块) 或者 -r(指定角色)的情况,下,比如指定-p,即使 playbook文件是 main.yml

另外上面的命令等同于

ansible-runner run /opt/app/ansible-runner/ --project-dir /opt/app/ansible-runner/project -p main.yml

默认会去 <private_data_dir>/project 中去寻找 -p 指定的 playbook 文件

所以,项目也可以不用放到 private_data_dir 目录下哦~

4. 获取执行结果

Ansible Runner可以让您方便地获取执行结果和输出。

记不记得在第一趴说过的 artifacts 目录,这个目录下就保存了结果输出、返回代码等,

注意这里每个任务都是一个 uuid, 可以通过 -i 来指定 任务名称 哦 ~

/opt/app/ansible-runner/artifacts/660d3189-5800-4a8f-a66c-4f01efe58d03
├── command
├── fact_cache
│   └── localhost
├── job_events
│   ├── 1-1fabd3ef-7588-4824-85c6-289e718914f3.json
│   ├── 2-5254000c-119d-5ed5-c3da-000000000002.json
│   ├── 3-5254000c-119d-5ed5-c3da-000000000008.json
│   ├── 4-0802a997-9e3b-48b5-b38f-036e8a6f1072.json
│   ├── 5-b4b52b8e-ce51-454e-bb73-67120f75cc8d.json
│   ├── 6-5254000c-119d-5ed5-c3da-000000000004.json
│   ├── 7-2d8d57cb-06eb-427c-ba4a-bdd86f40ee97.json
│   ├── 8-bd614303-55c7-429a-b5e1-e2c88c6d8908.json
│   └── 9-687a71f8-db29-4be6-8ec6-235aa0243b75.json
├── rc
├── status
├── stderr
└── stdout

也可以在Python程序中 通过访问run函数执行结果的 stdoutstderrrc等属性来获取任务的输出、错误信息和返回代码。

以下是一个示例代码:

from ansible_runner import run

result = run(private_data_dir='/opt/app/ansible-runner/')

# 获取任务的返回代码
return_code = result.rc

# 获取任务的输出
stdout = result.stdout

# 获取任务的错误信息
stderr = result.stderr

5. 处理回调事件

使用Ansible Runner,您可以通过注册回调函数来处理各种Ansible事件。可以使用event_handler参数来指定回调函数。以下是一个示例:

from ansible_runner import run

def event_callback(event_data):
    # 处理回调事件
    print("call event: ", event_data['event'])

result = run(
    private_data_dir='/opt/app/ansible-runner/',
    playbook='test.yml',
    event_handler=event_callback
)

直接结果如下:

call event:  playbook_on_start
call event:  playbook_on_play_start

PLAY [all] *********************************************************************
call event:  playbook_on_task_start

TASK [Gathering Facts] *********************************************************
call event:  runner_on_start
call event:  runner_on_ok
ok: [localhost]
call event:  playbook_on_task_start

TASK [testrole : just print a message to stdout] *******************************
call event:  runner_on_start
call event:  runner_on_ok
ok: [localhost] => {
    "msg": "hello from the ansible-runner testrole!"
}
call event:  playbook_on_task_start

TASK [debug] *******************************************************************
call event:  runner_on_start
call event:  runner_on_ok
ok: [localhost] => {
    "msg": "Test!"
}
call event:  playbook_on_stats

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

从结果可以看到

通过注册回调函数,可以对Ansible任务的各种事件进行自定义处理,如任务开始 runner_on_start 、任务完成 runner_on_ok、任务失败等。

下节课我们介绍ansible-runner的另外一个用法,就是在 作为Python的模块如何实现 crontab 统一任务管理平台

总结

本文介绍了Ansible Runner的基本使用方法,包括安装、配置和基本操作。通过使用Ansible Runner,可以更方便地集成Ansible到应用程序中,执行Ansible Playbook并获取执行结果。

同时,个人认为比较好的是 可以使用回调函数来处理各种Ansible事件。提供了更多的灵活性,可以根据需要进行自定义处理和操作。

如果想了解更多关于 ansible-runner 请参考 https://ansible-runner.readthedocs.io/en/latest/


如果觉得文章对你有用,请不吝点赞 和 关注个人公众号(搜索 全栈运维 或者 DailyJobOps

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值