首页 > 解决方案 > Jinja2 将字典列表视为字符串

问题描述

我正在使用 ansible 来解析 jinja2 模板。jinja2 模板有一段代码应该遍历一个变量,该变量是一个字典列表。但是,它将 dict 列表视为字符串并打印单个字符。请注意变量是 ansible playbook 中的 set_fact 。

在 j2 模板中的 dicts 列表上循环的代码:

{% 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 object' has no attribute 'name'”

但是,如果我在 jinja2 模板中使用 set 为变量分配相同的值并在其上使用 for 循环,它就可以正常工作。

{% 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)]

标签: templatesansiblejinja2

解决方案


filter_policy的变量有效地包含一个字符串,该字符串恰好是 dicts 列表的 json 表示。您只需使用过滤器将该 json 字符串解码为有效的字典列表from_json

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

    {{dict_item.name}}

{% endfor %}
{% endfor %}

推荐阅读