默认情况下有很多ansible模块都有非常详细的输出,例如sync
,file
和所有os_*
个,它们有在控制台上返回巨大结果的坏习惯
ANSIBLE_VERBOSITY
级别对这些没用,因为即使级别0也不会从输出中删除“结果”。
通过ANSIBLE_STDOUT_CALLBACK
使用替代输出插件是另一个失败原因,因为此时现有的替代回调都没有选项来禁用这些插件。
在每次出现的spammy模块中添加no_log: true
或更智能的替代方案(例如no_log: result.rc == 0
)在实践中无法扩展。
我知道可以在playbook级别定义no_log: true
,但这不允许我有条件地启用日志记录。
答案 0 :(得分:3)
如果你想要'清洁'解决方案,你应该写一个自定义回调插件,以减少输出量到所需的水平。
但您可以选择使用此变通方法根据详细程度有条件地模板no_log
:
---
- hosts: localhost
gather_facts: no
no_log: "{{ verbose_check | default(dict(skipped=true)) | skipped }}"
vars:
mydict:
password: abc
tasks:
- debug:
msg: "Shown only with verbosity > 2"
verbosity: 3
register: verbose_check
- debug:
var: mydict
debug
模块具有根据详细程度级别跳过的内置功能。我们可以注册它的输出并根据它定义no_log
。并且由于Jinja {{...}}
表达式在使用时被模板化而不是在定义时,因此每个后续任务都会根据跳过的状态评估no_log
到true
或false
{ {1}}。
答案 1 :(得分:0)
您可以根据详细级别(在 no_log
中公开,至少从 2.9 开始)对 ansible_verbosity
选项进行模板化
这将抑制其中一项任务,除非详细程度为 3 或更高。
- hosts: localhost
tasks:
- name: Show verbosity level
debug:
var: ansible_verbosity
- name: Get a list of installed packages
no_log: "{{ ansible_verbosity < 3 }}"
package_facts:
manager: auto
(通过将其与 this answer 结合,这也应该适用于整个游戏)