如何实时获取Ansible Play运行输出?能否禁用缓存及优化格式?
Ansible输出缓存配置与原始输出获取方案
一、输出缓存的启用与禁用
Ansible的输出缓存行为完全可通过配置调整:
- 禁用缓存(实时输出):使用
unbuffered标准回调插件,让Ansible不再缓存输出,实时打印任务的stdout和stderr内容。- 临时生效:执行命令时通过环境变量指定
ANSIBLE_STDOUT_CALLBACK=unbuffered ansible-playbook your_playbook.yml - 全局生效:在
ansible.cfg中配置[defaults] stdout_callback = unbuffered
- 临时生效:执行命令时通过环境变量指定
- 启用缓存(默认行为):保持默认的
default回调插件即可,该插件会缓存所有输出,任务结束后统一格式化呈现。
二、实时获取原始输出与JSON内容优化
1. 实时获取原始输出
使用上述unbuffered回调插件即可实现实时获取程序传递给Ansible的原始输出,无需等待任务完成。此外,确保任务未设置no_log: true(默认no_log: false),避免输出被隐藏。
2. 解决JSON输出压缩可读性问题
如果目标程序输出JSON,默认回调可能会对其结构化处理导致可读性下降,可通过以下方式获取原始JSON:
- 直接打印原始输出:通过
register变量捕获输出后,用debug模块打印stdout字段- name: 执行输出JSON的命令 command: your_json_producing_command register: json_output_result - name: 输出原始JSON内容 debug: msg: "{{ json_output_result.stdout }}" - 使用
json回调插件:若需要以原始JSON格式输出整个任务结果,可指定该插件ANSIBLE_STDOUT_CALLBACK=json ansible-playbook your_playbook.yml - 提升 verbosity 级别:执行 playbook 时添加
-v/-vv参数,可显示更接近原始的输出内容。
内容的提问来源于stack exchange,提问作者Matthieu Raynaud de Fitte
相关产品推荐
相关产品推荐

