在尝试通过Jinja中的if条件传递ansible变量时遇到以下错误。 (在其他地方,我可以传递字符串透明度,并在jinja中使用相同的条件,还可以在没有任何条件的情况下读取ansible变量)请使用任何线索...
山药提取物
---
tasks:
- set_fact:
ansible_role: "role1"
- name: Create the Jinja2 based template
template: src=./source.j2 dest=./output.txt
source.j2
---
{% for role in roles %}
{% if {{ ansible_role }} == role.name %}
{% for item in role.tests %}
"{{ item }}"
{% endfor %}
{% endif %}
{% endfor %}
错误
TASK [Create the Jinja2 based template] *************************************** fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: ---\n{% for role in roles %}\n{% if {{ ansible_role }} == role.name %}\n{% for item in role.tests %}\ninclude_controls \"{{ item }}\"\n{% endfor %}\n{% endif %}\n{% endfor %}\n"}
答案 0 :(得分:1)
花一些时间查看jinja2 template designer documentation。您的变量名称已经在jinja2表达式中。必须在表达式外部使用双花括号来写出变量的内容,而不是在表达式内部。
因此,您应该更改:
# !! WRONG !!
{% if {{ ansible_role }} == role.name %}
到
{% if ansible_role == role.name %}
我的最后2分:不要在您自己的变量名前加上ansible_
,因为ansible本身将其用于许多内部/魔术变量,并且可能导致混淆。
答案 1 :(得分:0)
我认为问题出在以下这一行:{% if {{ ansible_role }} == role.name %}
。当您使用{% %}
表示法时,Jinja需要使用python。因此,您无需转义ansible_role
变量。如果没有它,请尝试一下,看看现在是否可行。