ansible_runner
时间: 2025-07-31 19:11:51 AIGC 浏览: 14
### 安装和配置 ansible-runner
`ansible-runner` 是 Ansible 提供的一个封装库,用于以编程方式执行 Ansible 任务。它支持从 Python 脚本中运行 Playbook、模块命令,并提供对异步任务的支持。在使用 `ansible-runner` 之前,需要先安装:
```bash
pip install ansible-runner
```
确保系统上已正确安装 Ansible 并配置好相关目录结构,例如清单文件(inventory)和 Playbook 文件。
---
### 基本用法:运行 Playbook
以下是一个简单的示例,展示如何使用 `ansible-runner` 来执行一个现有的 Playbook 文件:
```python
import ansible_runner
r = ansible_runner.run(
playbook='site.yml',
inventory='hosts',
verbosity=1,
)
print(f"Status of the run: {r.status}")
print(f"Result of the run: {r.rc}")
```
此代码片段通过 `ansible_runner.run()` 方法执行指定的 Playbook 文件 `site.yml`,并使用 `hosts` 清单文件定义目标主机。`verbosity=1` 设置日志输出的详细程度,便于调试 [^4]。
---
### 执行 Ad-hoc 模块命令
除了 Playbook,`ansible-runner` 还可以用于执行 Ad-hoc 模块命令。例如,使用 `shell` 模块远程执行一条命令:
```python
import ansible_runner
r = ansible_runner.run(
module="shell",
module_args="echo 'Hello from Ansible'",
host_pattern="all",
inventory="hosts"
)
print(f"Command output: {r.stdout.read()}")
```
此代码调用了 Ansible 的 `shell` 模块,在所有目标主机上执行 `echo 'Hello from Ansible'` 命令,并打印输出结果 [^2]。
---
### 异步执行 Ansible 任务
对于长时间运行的任务,可以使用 `ansible-runner` 的异步模式进行非阻塞执行:
```python
import ansible_runner
runner = ansible_runner.run_async(
playbook='long_running_playbook.yml',
inventory='hosts'
)
print(f"Started async job with PID: {runner[0].pid}")
# 稍后检查状态
result = runner[0].get_result()
print(f"Job status: {result.status}")
```
该示例启动了一个异步任务并返回 PID,稍后可以通过 `get_result()` 获取执行结果,从而实现非阻塞式的任务调度 [^4]。
---
### 动态生成 Playbook 并执行
Python 可以结合 YAML 和 `ansible-runner` 实现动态生成 Playbook 内容并执行。例如,根据运行时参数构造 Playbook:
```python
import yaml
import tempfile
import ansible_runner
playbook_content = [
{
"name": "Run dynamic task",
"hosts": "all",
"tasks": [
{"name": "Gather facts", "setup": ""},
{"name": "Ping hosts", "ping": ""}
]
}
]
with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as tmpfile:
yaml.dump_all(playbook_content, tmpfile)
temp_playbook_path = tmpfile.name
r = ansible_runner.run(playbook=temp_playbook_path, inventory="hosts")
print(f"Execution status: {r.status}")
```
该方法适用于需要根据输入参数动态构建任务逻辑的场景 [^1]。
---
### 处理密码与凭证管理
在实际环境中,某些任务可能需要提供 SSH 密码或 sudo 凭证。可以通过 `passwords` 参数传递敏感信息:
```python
r = ansible_runner.run(
playbook='site.yml',
inventory='hosts',
passwords={'conn_pass': 'your_ssh_password', 'become_pass': 'sudo_password'}
)
```
注意,这种方式适合测试环境,在生产环境中应优先使用密钥认证或 Vault 加密机制来保护敏感数据 [^1]。
---
### 解析执行结果与日志
`ansible-runner` 提供了多种方式获取执行结果。可以通过 `stdout.read()` 或 `events` 获取详细的执行日志:
```python
for event in r.events:
print(event['event']) # 输出每个事件类型
print(r.stdout.read()) # 输出完整标准输出
```
此外,也可以将日志输出到文件以便后续分析:
```python
with open("ansible_output.log", "w") as f:
f.write(r.stdout.read())
```
这有助于在自动化平台中实现日志审计与错误追踪 [^4]。
---
阅读全文
相关推荐














