Ansible 怎么配置 callback 插件将执行结果输出到 JSON 文件?

文章导读
最稳妥的方式是通过环境变量或配置文件启用内置的 json callback 插件,并结合 shell 重定向将标准输出保存为文件,适合需要机器解析执行结果的自动化场景。
📋 目录
  1. 命令速用版
  2. JSON 输出样例
  3. 版本与结构兼容性
  4. 分步处理
  5. 怎么验证是否生效
  6. 常见坑
A A

最稳妥的方式是通过环境变量或配置文件启用内置的 json callback 插件,并结合 shell 重定向将标准输出保存为文件,适合需要机器解析执行结果的自动化场景。

先说结论:Ansible 内置的 json 插件负责格式化输出,本身不直接写文件,需配合重定向实现落盘。

  • 适合:CI/CD 流水线、需要后续脚本解析执行结果的场景
  • 先准备:确认 Ansible 版本支持 callback 机制,规划好输出文件路径
  • 验收:检查生成的 JSON 文件是否符合语法规范,能否被 jq 等工具解析

命令速用版

如果你希望快速测试,可以直接在命令行中设置环境变量并重定向输出,无需修改配置文件:

export ANSIBLE_STDOUT_CALLBACK=json
ansible-playbook -i hosts site.yml > result.json

若希望永久生效,可在当前目录或 ~/.ansible.cfg 中添加配置(优先级:当前目录 > 家目录 > /etc/ansible):

[defaults]
stdout_callback = json

JSON 输出样例

启用插件后,标准输出将变为结构化 JSON。以下是一个简化后的结构样例,实际内容取决于 playbook 执行情况:

{
    "custom_stats": {},
    "plays": [
        {
            "play": {
                "name": "Example Play",
                "id": "..."
            },
            "tasks": [
                {
                    "hosts": {
                        "localhost": {
                            "_result": {
                                "changed": true,
                                "msg": "Success"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "stats": {
        "localhost": {
            "changed": 1,
            "failures": 0
        }
    }
}

解析脚本建议基于 playsstats 字段构建,避免依赖深层嵌套的具体任务结果,以减少版本变动影响。

Ansible 怎么配置 callback 插件将执行结果输出到 JSON 文件?

版本与结构兼容性

不同 Ansible 核心版本中 json 插件输出的字段结构可能有细微差别。例如,某些版本可能在 tasks 层级结构上有所调整。

建议措施:

  • 生产环境固定 Ansible 版本,避免随意升级导致解析脚本失效。
  • 编写解析脚本前,先用 jq 'keys'jq '.plays[0] | keys' inspect 实际输出结构。
  • 关注 Ansible release notes 中关于 callback 插件的变更说明。

分步处理

1. 确认插件可用性
先确认当前环境包含 json 插件,大多数标准安装的 Ansible 都自带该插件。可以使用以下命令查看可用的 callback 插件列表:

ansible-doc -t callback -l | grep json

2. 配置输出格式
推荐优先使用环境变量方式,避免污染全局配置。在执行 playbook 前导出变量:

Ansible 怎么配置 callback 插件将执行结果输出到 JSON 文件?
export ANSIBLE_STDOUT_CALLBACK=json

如果是在 CI 环境中,建议在任务步骤里直接声明环境变量,而不是依赖全局设置。

3. 执行并重定向
运行 playbook 时使用 shell 重定向符号将 stdout 写入文件。注意不要遗漏 stderr,通常建议分开处理:

ansible-playbook -i inventory.ini playbook.yml > output.json 2> error.log

4. 权限与路径检查
确保执行用户对目标文件路径有写入权限。如果是在容器或受限环境中,建议输出到临时目录如/tmp。

怎么验证是否生效

执行完成后,不要直接用 cat 查看大文件,建议使用 jq 工具验证 JSON 合法性:

cat output.json | jq . > /dev/null && echo "JSON valid" || echo "JSON invalid"

如果 jq 报错,说明输出中可能混入了非 JSON 内容(例如警告信息)。此外,检查文件大小是否为零,零字节通常意味着执行未开始或重定向失败。

Ansible 怎么配置 callback 插件将执行结果输出到 JSON 文件?

常见坑

1. 标准错误混入
有些警告或错误信息会输出到 stderr,如果只用>重定向,这些内容不会进入 JSON 文件,但可能影响终端排查。如果需要完整日志,需单独处理 stderr。

2. 人类可读性丧失
开启 json 回调后,终端不再显示彩色进度条和易读文本,调试体验会下降。建议仅在自动化调用时开启,人工执行时保持默认。

3. 插件版本差异
不同 Ansible 版本中 json 插件输出的字段结构可能有细微差别。如果是生产解析,建议先固定 Ansible 版本,不要随意升级,并在脚本中加入结构兼容性检查。

4. 日志轮转冲突
如果同时开启了 log_plays 等其他日志插件,可能会产生多份日志文件,注意磁盘空间管理。