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

时间:2016-07-25 01:02:20

标签: ansible jinja2

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

我的目的是在条件中为value的Ansible任务创建一个when子句。 Per"注意"在Ansible documentation链接时,我尝试添加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 }}"

结果的相关部分:

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

以下结果来自何处?

  • Hello world!
  • __omit_place_holder__63eea0d96dd6ed867b95405e11d87dddf61f448d

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

1 个答案:

答案 0 :(得分:3)

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

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

  • None | default('0') | int or omit None我在这里用于解释目的)
  • '0' | int or omit
  • 0 or omit
  • omit

最后一步是因为python中的boolean operations

  

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

考虑到这一点,您的任务将以这种方式解释:

- debug: msg="{{ omit }}"
- debug: msg="debug {{ omit }}"

导致第一个debug没有msg参数调用(omit为{}},第二个debug调用msg="debug __omit_place_holder..." omit这里与debug连接起来,所以它变成了一个普通的字符串。)

如果在没有debug参数的情况下调用msg模块,则会打印Hello world!