在很早之前学习 Ansible
时,使用官网的 ansible 模块,自己封装过简单的脚本接口,实现Python执行 playbook 和 AdHoc, 详细可以参考 Python Ansible API 实战[1]
今天在网上看到一个开源的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函数执行结果的 stdout
、stderr
和rc
等属性来获取任务的输出、错误信息和返回代码。
以下是一个示例代码:
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
)
引用链接
[1]
Python Ansible API 实战: http://www.colinspace.com/blog/post/45/
原文始发于微信公众号(菩提老鹰):Python使用ansible-runner模块实现ansible调用学习
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/253761.html