首页 > 解决方案 > 如何在 Ansible(Jinja2 模板)中修复“假”被评估为真

问题描述

如何确保 Ansible 戏剧/角色中使用的 Jinja2 模板易于"false"被评估True


背景:

Ansible 中的布尔处理很棘手,与 Jinja2 模板一起使用时可能会导致意外结果。

事实证明 Ansible 处理不同的"false"值:

看看这个简单的例子:

---
- 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即使变量 is打印第一个任务'false',第二个任务也会跳过:

PLAY [Sample play] *********************************************************************************************************************************************************************

TASK [Print enabled / disabled with Jinja2 inline condition] ***************************************************************************************************************************
ok: [localhost] => {
    "msg": "enabled"
}

TASK [Print enabled] *******************************************************************************************************************************************************************
skipping: [localhost]

标签: ansiblejinja2

解决方案


您可以使用两种方法来确保在 Jinja2 模板"false"中进行评估:False

1.使用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.使用断言

您还可以强制变量值是布尔值而不是带有断言的字符串:

- assert:
  that:
    - enabled == enabled | bool

    # or you may use `type_debug` filter
    - enable | type_debug == 'bool'

只需在您的 Ansible 角色/剧本的开头添加此内容。true如果变量不是 a或,它将失败false

对于这部剧:

---
- 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"
}

推荐阅读