ansible - 如何修复 Ansible 中评估为 True 的 "false"(Jinja2 模板)

标签 ansible jinja2

如何确保 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 角色/剧本的开头即可。如果变量不是 truefalse,它将失败。

对于此剧:

---
- hosts: localhost
  gather_facts: false
  tasks:
    - assert:
        that:
          - item == item | bool
      with_items:
        - "true"
        - "false"
        - true
        - false

只有 truefalse 通过,"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/

相关文章:

python - Jinja 模板变量语法

bash - Ansible:如何使用 Ansible chmod +x 文件?

ansible - jinja2-AnsibleUndefinedVariable : 'dict object' has no attribute '"{{ target_hosts } }"' "

linux - 使用 ansible 查找和复制文件

ansible - 任务内部对 `item` 的 Ansible 字典引用的别名?

python - Jinja2 For 循环导致 Google App Engine 崩溃

python - 如何使用 Jinja2 打印表格(无需页面刷新)

python - Ansible - 按最后一个参数(IP 地址)对命令列表进行排序

ansible - 如何在 Ansible 主机变量中使用 Jinja2 循环索引?

python - 使用Django传递数据时如何在html中的<p>标签内添加新行?