如何确保 Ansible 角色/角色中使用的 Jinja2 模板容易出现 "false"
被评估为True
?
背景:
Ansible 中的 bool 处理很棘手,与 Jinja2 模板一起使用时可能会导致意外结果。
事实证明 Ansible 的处理方式不同 "false"
值:
- 当用于
when
时子句的计算结果为False
- 在 Jinja2 模板中使用时,其计算结果为
True
看一下这个简单的例子:
---
- name: Sample play
hosts: localhost
gather_facts: false
vars:
enabled: 'false'
tasks:
- name: Print enabled / disabled with Jinja2 inline condition
debug:
msg: "{{ 'enabled' if enabled else 'disabled' }}"
- name: Print enabled
debug:
msg: Enabled
when: enabled
第一个任务打印 enabled
即使变量是 'false'
,第二个任务跳过:
PLAY [Sample play] *********************************************************************************************************************************************************************
TASK [Print enabled / disabled with Jinja2 inline condition] ***************************************************************************************************************************
ok: [localhost] => {
"msg": "enabled"
}
TASK [Print enabled] *******************************************************************************************************************************************************************
skipping: [localhost]
最佳答案
您可以使用两种方法来确保 Jinja2 模板中的 "false"
计算为 False
:
<强>1。使用bool
过滤器
当使用 bool 类型的变量时,只需将 bool
过滤器添加到每个 Jinja2 条件即可:
---
- hosts: localhost
gather_facts: false
tasks:
- debug:
msg: "{{ 'enabled' if item | bool else 'disabled' }}"
with_items:
- "true"
- "false"
- true
- false
结果是:
TASK [debug] ***************************************************************************************************************************************************************************
ok: [localhost] => (item=true) => {
"msg": "enabled"
}
ok: [localhost] => (item=false) => {
"msg": "disabled"
}
ok: [localhost] => (item=True) => {
"msg": "enabled"
}
ok: [localhost] => (item=False) => {
"msg": "disabled"
}
或者在模板文件中:
{% if enabled | bool %}
# ...
{% endif %}
<强>2。使用断言
您还可以强制变量值是 bool 值而不是带有断言的字符串:
- assert:
that:
- enabled == enabled | bool
# or you may use `type_debug` filter
- enable | type_debug == 'bool'
只需将其添加到您的 Ansible 角色/剧本的开头即可。如果变量不是 true
或 false
,它将失败。
对于此剧:
---
- hosts: localhost
gather_facts: false
tasks:
- assert:
that:
- item == item | bool
with_items:
- "true"
- "false"
- true
- false
只有 true
和 false
通过,"true"
和 "false"
被拒绝:
TASK [assert] **************************************************************************************************************************************************************************
failed: [localhost] (item=true) => {
"assertion": "item == item | bool",
"changed": false,
"evaluated_to": false,
"item": "true"
}
failed: [localhost] (item=false) => {
"assertion": "item == item | bool",
"changed": false,
"evaluated_to": false,
"item": "false"
}
ok: [localhost] => (item=True) => {
"changed": false,
"item": true,
"msg": "All assertions passed"
}
ok: [localhost] => (item=False) => {
"changed": false,
"item": false,
"msg": "All assertions passed"
}
关于ansible - 如何修复 Ansible 中评估为 True 的 "false"(Jinja2 模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458247/