Jinja2 如果定义了变量,则从引用变量的 Ansible 默认值设置变量

Jinja2 if variable is defined set variable from Ansible defaults which references variable

在 Ansible 角色中,我正在 Jinja2 模板中测试是否定义了变量。如果已定义,则应设置 Ansible 的 defaults/main.yml 中引用此变量的变量。

只要定义了在 Jinja2 模板中测试的变量,这就可以正常工作。如果不是,Ansible 会抱怨一个未定义的变量。

示例角色文件:

$ cat defaults/main.yml
---
database_name: "prefix-{{ database }}"

$ cat tasks/main.yml 
---
- name: Deploy config
  template:
    src: config.j2
    dest: /opt/config
    mode: 0644

$ cat templates/config.j2 
# this works
{% if database is defined %}
Database={{ database }}
{% endif %}

# this is broken
{% if database is defined %}
Database={{ database_name }}
{% endif %}

在测试它是否存在后直接使用变量(参见上面的“这个有效”)就可以了。
如何使用 defaults/main.yml 中的变量?

长话短说:在 defaults/main.yml

database_name: "prefix-{{ database | default('db_does_not_exist') }}"

您可以阅读 ansible 和 jinja2 代码以清楚地理解为什么,但基本上,Jinja2 会在解释时尝试读取您的 var,即使在您的 if 条件内(结果证明是假的),并找到它尝试的另一个 var再次解释未定义的内容。

以上默认值永远不会在您的情况下使用,但会阻止您的模板触发此错误(或使用它的任何其他任务)