Ansible jinja2 过滤器'|'(管道)是什么意思?

Ansible jinja2 filters '|'(pipe) what does it mean?

我写了一个任务如下,但是不明白'|'是什么是吗?

tasks:
 - shell: /usr/bin/foo
   register: result
   ignore_errors: True

 - debug: msg="it failed"
   when: result|failed

 - debug: msg="it changed"
   when: result|changed

另外我在网上找到了一些例子,但无法理解'|'是什么是吗?

debug: msg={{ ipaddr |replace(",", ".") }}

再举一个例子:

- hosts: localhost
  vars:
    D:
      1 : "one"
      2 : "two"
  tasks:
    - debug: var=D
    - debug: msg="D[1] is {{ D[1]|default ('undefined') }}"

如果有人可以详细解释或指出一些我会很棒 URL?

如有任何帮助,我们将不胜感激。

谢谢。

使用竖线字符,您可以将值传递给过滤器。有很多Jinja 2 filters but Ansible brings some additional filters.

术语 过滤器 有时可能会令人困惑,因为所有过滤器的工作方式都大不相同。例如,一些减少 hash/array 的结果集,一些修改字符串的内容,但还有一些过滤器只是 return 真或假。

更好的解释可能是那些是修饰符,它们可以对您传递的数据做任何事情。你甚至可以 write your own filters.

过滤器可以链接起来,将第一个过滤器的结果传递给下一个过滤器,依此类推。它的工作原理与 unix 上的管道命令完全相同 shell.

"value" | filter1 | filter2 | filterN

failed过滤器returns true如果传递结果失败。它只是从 result.

检查 failed 属性

changed过滤器同理,只是检查传递的结果是否有变化。它从 result.

检查 changed 属性

ipaddr | replace(",", ".") 将所有出现的 , 替换为 .。因此 127,0,0,1 的值将被转换为 127.0.0.1.

如果输入为空,default 过滤器将设置一个默认值,例如一个未定义的变量。 undefined_var | default("var was undefined") -> 这将打印 undefined_var 的内容或字符串 "var was undefined"。在上面给定的示例中,您输出了 D (D[1]) 的第二个元素的值,如果它不存在,则改为 "undefined"。

任何遇到这个问题的更新,试图弄清楚为什么 when: result|failed 等行停止工作,

tl;dr:尝试用 is 替换 | 所以,

when: result|failed

变成,

when: result is failed

从 Ansible 2.9 开始(“使用 Ansible 提供的 jinja 测试作为过滤器将是 removed in Ansible 2.9.),在条件语句中使用 |因为 when: result|failed 会触发错误。 | 是(曾经)让 Ansible 使用 jinja2 filter,但这些现在被 jinja2 tests 取代,它有语法略有不同,旧的 jinja2 filter 名称保留为 jinja2 test names.

在某些情况下,将 | 替换为 is 看起来有点奇怪,因此尽管(例如)when: result is success 有效,但 successsuccessful是别名所以 when: result is successful 看起来更好。

Ansible 2.5 Porting Guide 中有更多详细信息。