Синтаксическая ошибка Jinja2: ожидаемый токен «конец оператора печати» - PullRequest
0 голосов
/ 09 марта 2019

Приведенный ниже шаблон Jinja2 используется Ansible для создания файла конфигурации именованной зоны. Сбой во время выполнения 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"}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Добавление ответа в качестве первого решает половину ошибки. Приведенный ниже шаблон 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 %}
0 голосов
/ 10 марта 2019

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

Вы не можете использовать такие вложенные выражения, поскольку 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 }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...