小编Luc*_*tto的帖子

如何在没有 no_log 的情况下不打印 Ansible 循环错误中的项目

当我使用一个循环执行 ansible 模块时,该模块包含包含模块要使用的值(包括机密信息)的字典,我可以使用 隐藏它loop_control.label,但在发生错误时则不能。

- ansible.module:
    arg1: "{{ item.name }}"
    arg2: "{{ item.some_value }}"
    arg3: "{{ item.secret }}"
    arg4: "{{ item.throw_error }}"
  loop: 
    - name: "item1"
      some_value: "my value"
      secret: "p4$$w0rd"
  loop_control:
    label: "{{ item.name }}"
Run Code Online (Sandbox Code Playgroud)

我可以使用 隐藏它no_log: true,但它会隐藏所有内容,包括成功发生时以及错误消息,这可能完全没问题,并且当我看不到它时,让我对实际错误一无所知。

这类似于停止反向代理中的所有日志,或记录所有内容,包括授权标头,这两者在生产环境中都远远达不到预期。

那么,有没有办法让它在发生错误时不记录循环项,而是记录其他所有内容?它可以是一个任务标志,就像 一样no_log,也可以是一些全局配置,包含在ansible.cfg文件中。

更新(2021-04-19)

弗拉基米尔的答案实际上可以作为一种解决方法,但使用它有几个缺点:

  1. 您必须jmespath在运行过滤器之前安装该库json_query
  2. 它有更多的代码,并使整个代码的可读性较差。
  3. 如果你有很多循环(我的特定项目有超过 80 个循环),代码可能会变得非常丑陋(也是因为第 2 点)。
  1. 如果父文件中有循环,则应在调试循环中使用loop_controlwith 。loop_var
  2. 错误和显示错误消息的位置将是不同的地方。这同样适用于成功消息。
  3. label任务中的循环debug将与主循环任务中的循环不同(这可能会使将成功和错误情况与实际项目关联起来更加困难)。 …

ansible

10
推荐指数
1
解决办法
2万
查看次数

标签 统计

ansible ×1