【问题标题】:Ansible jinja2 filters '|'(pipe) what does it mean?Ansible jinja2过滤器'|'(管道)是什么意思?
【发布时间】:2015-06-17 05:46:27
【问题描述】:

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

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 docs了吗?
  • 我在我维护的代码中看到了这一点,并认为“Python 有像 shell 一样的管道!?”。感谢这个问题让我明白了!

标签: ansible jinja2


【解决方案1】:

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

过滤器这个词有时可能会让人感到困惑,因为所有过滤器的工作方式都大不相同。例如,一些减少哈希/数组的结果集,一些修改字符串的内容,但是有些过滤器只是简单地返回 true 或 false。

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

过滤器可以链接,将结果从第一个过滤器传递到下一个过滤器,依此类推。它的工作方式与 unix shell 上的管道命令完全相同。

"value" | filter1 | filter2 | filterN

如果传递的结果失败,failed 过滤器将返回 true。它只是检查来自resultfailed 属性。

changed 过滤器相同,但检查传递的结果是否有变化。它检查来自resultchanged 属性。

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]) 的第二个元素的值,如果它不存在,则改为“未定义”。

【讨论】:

    【解决方案2】:

    对于任何遇到此问题并试图弄清楚为什么 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 名称。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2013-11-26
      相关资源
      最近更新 更多