我可以根据ansible详细级别制作ansible no_log默认值吗?

时间:2018-02-02 12:58:46

标签: ansible

默认情况下有很多ansible模块都有非常详细的输出,例如syncfile和所有os_*个,它们有在控制台上返回巨大结果的坏习惯

ANSIBLE_VERBOSITY级别对这些没用,因为即使级别0也不会从输出中删除“结果”。

通过ANSIBLE_STDOUT_CALLBACK使用替代输出插件是另一个失败原因,因为此时现有的替代回调都没有选项来禁用这些插件。

在每次出现的spammy模块中添加no_log: true或更智能的替代方案(例如no_log: result.rc == 0)在实践中无法扩展。

我知道可以在playbook级别定义no_log: true,但这不允许我有条件地启用日志记录。

2 个答案:

答案 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_logtruefalse { {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 结合,这也应该适用于整个游戏)