【问题标题】:Jinja2 is treating list of dictionary as stringJinja2 将字典列表视为字符串
【发布时间】:2019-06-07 16:59:04
【问题描述】:

我正在使用 ansible 来解析 jinja2 模板。 jinja2 模板有一段代码应该遍历一个变量,该变量是一个字典列表。但是,它将 dict 列表视为字符串并打印单个字符。请注意变量是 ansible playbook 中的 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 object' 没有属性 '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)]

【问题讨论】:

    标签: templates ansible jinja2


    【解决方案1】:

    filter_policy 变量实际上包含一个字符串,该字符串恰好是 dicts 列表的 json 表示。您只需使用 from_json filter 将该 json 字符串解码为有效的字典列表即可

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

    【讨论】:

    • 效果很好。不敢相信我花了整整一个晚上才这样做。
    猜你喜欢
    • 2022-11-04
    • 1970-01-01
    • 2016-01-27
    • 2011-07-12
    • 2014-05-23
    • 2019-05-29
    相关资源
    最近更新 更多