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再次解释未定义的内容。
以上默认值永远不会在您的情况下使用,但会阻止您的模板触发此错误(或使用它的任何其他任务)
在 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再次解释未定义的内容。
以上默认值永远不会在您的情况下使用,但会阻止您的模板触发此错误(或使用它的任何其他任务)