Jinja2 рассматривает список словаря как строку - PullRequest
0 голосов
/ 07 июня 2019

Я использую ansible для разбора шаблона jinja2. Шаблон jinja2 содержит фрагмент кода, который должен перебирать переменную, представляющую собой список слов. Однако он обрабатывает список dict как строку и печатает отдельные символы. Обратите внимание, что переменная set_fact в заданной книге воспроизведения.

Код для цикла в списке диктов в шаблоне j2:

{% for subscriber in subscribers %}
{% for dict_item in subscriber['filter_policy'] %}

    {{dict_item.name}}

{% endfor %}
{% endfor %}

Переменная как вывод в модуле отладки ansible:

 subscribers": [
        {
            "filter_policy": "[  {    \"name\": \"Severity\",    \"type\": \"CommaDelimitedList\",    \"value\": \"critical\"  },  {    \"name\": \"Environment\",    \"type\": \"CommaDelimitedList\",    \"value\": \"nonprod\"  }]",
            "id": "blah@blah.com"
        }
    ]

Ansible дает мне ошибку, говоря: "msg": "AnsibleUndefinedVariable: 'объект str' не имеет атрибута 'name'"

Однако, если я использую set в шаблоне jinja2, чтобы присвоить переменную одно и то же значение, и использую для нее цикл, он работает нормально.

{% set policies = [{"name": "Severity","type": "CommaDelimitedList","value": "critical"},{"name": "Environment","type": "CommaDelimitedList","value": "nonprod"}] %}

Понятия не имею, как ее решить.

ansible 2.7.2
python version = 3.7.3 (default, Mar 27 2019, 09:23:39) [Clang 10.0.0 (clang-1000.11.45.5)]

1 Ответ

0 голосов
/ 07 июня 2019

Вы filter_policy переменная эффективно содержит строку, которая оказывается json-представлением списка диктов.Вам просто нужно декодировать эту строку json в эффективный список диктов с помощью фильтра from_json

{% for subscriber in subscribers %}
{% for dict_item in (subscriber['filter_policy'] | from_json) %}

    {{dict_item.name}}

{% endfor %}
{% endfor %}
...