无法使用if条件解析jinja文件中的ansible变量

时间:2019-07-25 15:07:16

标签: ansible jinja2

在尝试通过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"}

2 个答案:

答案 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变量。如果没有它,请尝试一下,看看现在是否可行。