Ansible:使用 Jinja2 过滤器链接时“省略占位符”

tec*_*raf 3 jinja2 ansible

在调试带有过滤器链接的条件子句并检查未定义变量 ( omit) 时,我发现结果取决于过滤器如何包含在字符串中。

我的目的是value在条件下为 Ansible 任务创建一个 when 子句。根据Ansible 文档中链接的“注释” ,我尝试添加omit并获得以下结果。

我的剧本:

---
- hosts: target
  tasks:
    - debug: msg="{{ value_not_defined|default('0') | int or omit }}"
    - debug: msg="debug {{ value_not_defined|default('0') | int or omit }}"
Run Code Online (Sandbox Code Playgroud)

结果的相关部分:

TASK [debug] *******************************************************************
ok: [192.168.1.2] => {
   "msg": "Hello world!"
}

msg: Hello world!

TASK [debug] *******************************************************************
ok: [192.168.1.2] => {
    "msg": "debug __omit_place_holder__31268e787e722b495d512986994bcd66ce943a69"
}

msg: debug __omit_place_holder__63eea0d96dd6ed867b95405e11d87dddf61f448d
Run Code Online (Sandbox Code Playgroud)

以下结果从何而来?

  • Hello world!
  • __omit_place_holder__63eea0d96dd6ed867b95405e11d87dddf61f448d

为什么值会根据debug's 中的其他字符串而变化msg

Kon*_*rov 5

在 ansible 中omit是一个特殊变量,如果您不想向模块提供参数,则使用该变量。
因此,如果您传递arg="{{omit}}"给模块,则相当于根本不传递arg
如果您想在自定义参数未定义的情况下依赖模块的默认值,这将非常有用。文档中
有一个例子。

在您的示例{{ value_not_defined|default('0') | int or omit }}中评估如下:

  • None | default('0') | int or omit None我在这里使用是为了说明目的)
  • '0' | int or omit
  • 0 or omit
  • omit

最后一步是因为python中的布尔运算

以下值被解释为 false:False、None、所有类型的数字零以及空字符串和容器

考虑到这一点,您的任务是这样解释的:

- debug: msg="{{ omit }}"
- debug: msg="debug {{ omit }}"
Run Code Online (Sandbox Code Playgroud)

导致调用第一个debug没有msg参数(这就是omitfor),第二个debugwith msg="debug __omit_place_holder..."(omitdebug这里连接,所以它只是一个普通的字符串)。

如果debug不带msg参数调用模块,则打印Hello world!.