Ansible Jinja2语法错误:应为令牌';打印结束语句';

Ansible Jinja2语法错误:应为令牌';打印结束语句';,ansible,syntax-error,jinja2,Ansible,Syntax Error,Jinja2,Ansible使用以下Jinja2模板生成命名区域配置文件。它在playbook执行期间失败(使用模板模块),但错误对我来说有点神秘,所以我没有设法修复它 {# This template defines a named zone based on the dictionnary of the containers metadata #} @ IN SOA {{ net_search_domain }}. admin.{{ net_search_domain }}. ( {{ ans

Ansible使用以下Jinja2模板生成命名区域配置文件。它在playbook执行期间失败(使用模板模块),但错误对我来说有点神秘,所以我没有设法修复它

{# This template defines a named zone based on the dictionnary of the containers metadata #}
@   IN SOA {{ net_search_domain }}. admin.{{ net_search_domain }}. (
    {{ ansible_date_time['epoch'] }} ; serial
    3600       ; refresh
    1800       ; retry
    604800     ; expire
    600 )      ; ttl

{{ ansible_hostname }} IN A    {{ ansible_{{net_int_dmz_untrusted}}['ipv4']['address'] }}
{{ ansible_hostname }} IN AAAA {{ ansible_{{net_int_dmz_untrusted}}['ipv6']['address'] }}

{% for items in net_containers %}
{{ item.value.rproxy_be }} IN A    {{ item.value.ipv4_container }}
{{ item.value.rproxy_be }} IN AAAA {{ item.value.ipv6_container }}
{% if {{ item.value.rproxy_fe }} != {{ item.value.rproxy_be }} %}
{{ item.value.rproxy_fe }} IN A    {{ ansible_{{net_int_dmz_untrusted}}['ipv4']['address'] }}
{{ item.value.rproxy_fe }} IN AAAA {{ ansible_{{net_int_dmz_untrusted}}['ipv6']['address'] }}
{% endif %}
{% endfor %}

rtr     IN AAAA xxxx:yyyy:zzzz:wwww:208:a2ff:fe0e:d127
printer IN AAAA xxxx:yyyy:zzzz:wwww:3205:5CFF:FE7C:6240
Ansible运行时出错:

    failed: [192.168.11.6] (item={'file': '/home/nicolas/Documents/Configurations/Ansible/server/roles/containers/templates/named_domain.j2', 'target': '/srv/docker/dns/example.net'}) => {"changed": false, "item": {"file": "/home/nicolas/Documents/Configurations/Ansible/server/roles/containers/templates/named_domain.j2", "target": "/srv/docker/dns/example.net"}, 
"msg": "AnsibleError: template error while templating string: expected token 'end of print statement', got '{'. String: {# This template defines a named zone based on the dictionnary of the containers metadata #}
\n@   IN SOA {{ net_search_domain }}. admin.{{ net_search_domain }}. (\n    {{ ansible_date_time['epoch'] }} ; serial\n    3600       ; refresh
\n    1800       ; retry\n    604800     ; expire\n    600 )      ; ttl\n\n{{ ansible_hostname }} IN A    {{ ansible_{{net_int_dmz_untrusted}}['ipv4']['address'] }}
\n{{ ansible_hostname }} IN AAAA {{ ansible_{{net_int_dmz_untrusted}}['ipv6']['address'] }}\n\n{% for items in net_containers %}\n{{ item.value.rproxy_be }} IN A    {{ item.value.ipv4_container }}
\n{{ item.value.rproxy_be }} IN AAAA {{ item.value.ipv6_container }}\n{% if {{ item.value.rproxy_fe }} != {{ item.value.rproxy_be }} %}\n{{ item.value.rproxy_fe }} IN A    {{ ansible_{{net_int_dmz_untrusted}}['ipv4']['address'] }}\n{{ item.value.rproxy_fe }} IN AAAA {{ ansible_{{net_int_dmz_untrusted}}['ipv6']['address'] }}
\n{% endif %}\n{% endfor %}\n\nrtr     IN AAAA xxxx:yyyy:zzzz:wwww:208:a2ff:fe0e:d127\nprinter IN AAAA xxxx:yyyy:zzzz:wwww:5CFF:FE7C:6240\n\n\n"}
{{ansible{net{int\u dmz{u untrusted}}['ipv4']['address']}}中的{ansible{hostname}}

您不能像那样使用嵌套表达式,因为Jinja不进行递归计算。要执行您试图执行的操作,请将
vars
视为
dict
,并以这种方式查找键:

{{ ansible_hostname }} IN A    {{ vars["ansible_"+net_int_dmz_untrusted]['ipv4']['address'] }}

另外,尽管您没有问这个问题,但您确实会更乐意将这些表达式指定给变量,而不是到处复制粘贴:

{# This template defines a named zone based on the dictionnary of the containers metadata #}
{% set the_addr4 = vars["ansible_"+net_int_dmz_untrusted]['ipv4']['address'] %}
{% set the_addr6 = vars["ansible_"+net_int_dmz_untrusted]['ipv6']['address'] %}
{{ ansible_hostname }} IN A    {{ the_addr4 }}
{{ ansible_hostname }} IN AAAA {{ the_addr6 }}

在这里添加一个答案作为前一个解决了一半的错误。 以下Jinja2模板是提供预期输出的最终模板:

@   IN SOA {{ net_search_domain }}. admin.{{ net_search_domain }}. (
    {{ ansible_date_time['epoch'] }} ; serial
    3600       ; refresh
    1800       ; retry
    604800     ; expire
    600 )      ; ttl

{% set addr4 = hostvars[inventory_hostname]['ansible_default_ipv4']['address'] %}
{% set addr6 = hostvars[inventory_hostname]['ansible_default_ipv6']['address'] %}
{{ ansible_hostname }} IN A    {{ addr4 }}
{{ ansible_hostname }} IN AAAA {{ addr6 }}

{% for item in net_containers %}
{{ net_containers[item].rproxy_be }} IN A    {{ net_containers[item].ipv4_container }}
{{ net_containers[item].rproxy_be }} IN AAAA {{ net_containers[item].ipv6_container }}
{% if net_containers[item].rproxy_be != net_containers[item].rproxy_fe %}
{{ net_containers[item].rproxy_fe }} IN A    {{ addr4 }}
{{ net_containers[item].rproxy_fe }} IN AAAA {{ addr6 }}
{% endif %}
{% endfor %}

谢谢你的提示,我改变了这个,但还是没有运气。同样的错误依然存在。除了您建议的更改之外,Jinja2与之类似,包括设置变量。我想在那个文件的其他地方还有另一个语法错误。那么你能发布你新编辑的文件吗?因为除非你只修复了4个错误中的一个,否则我无法想象为什么jinja会不高兴。最终它成功了。你的答案是答案的一半。我还必须从if语句中删除大括号({符号),然后Jinja2模板将按预期呈现。