Ansible:"omit place holder" 使用 Jinja2 过滤器链时
Ansible: "omit place holder" when using Jinja2 filter chaining
在使用过滤器链调试条件子句并检查未定义变量 (omit
) 时,我发现结果取决于过滤器在字符串中的包含方式。
我的目的是为条件为 value
的 Ansible 任务创建 when 子句。根据 "Note" 在 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
的 msg
中的其他字符串而变化?
在 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:
the following values are interpreted as false: False, None, numeric zero of all types, and empty strings and containers
考虑到这一点,您的任务是这样解释的:
- debug: msg="{{ omit }}"
- debug: msg="debug {{ omit }}"
导致调用第一个 debug
没有 msg
参数(这就是 omit
的作用)和第二个 debug
与 msg="debug __omit_place_holder..."
(omit
在这里与 debug
连接,因此它只是一个普通的字符串)。
如果在没有 msg
参数的情况下调用 debug
模块,它会打印 Hello world!
.
在使用过滤器链调试条件子句并检查未定义变量 (omit
) 时,我发现结果取决于过滤器在字符串中的包含方式。
我的目的是为条件为 value
的 Ansible 任务创建 when 子句。根据 "Note" 在 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
的 msg
中的其他字符串而变化?
在 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:
the following values are interpreted as false: False, None, numeric zero of all types, and empty strings and containers
考虑到这一点,您的任务是这样解释的:
- debug: msg="{{ omit }}"
- debug: msg="debug {{ omit }}"
导致调用第一个 debug
没有 msg
参数(这就是 omit
的作用)和第二个 debug
与 msg="debug __omit_place_holder..."
(omit
在这里与 debug
连接,因此它只是一个普通的字符串)。
如果在没有 msg
参数的情况下调用 debug
模块,它会打印 Hello world!
.