在Ansible / Jinja中过滤词典和打印值列表

时间:2017-03-06 14:52:56

标签: python dictionary ansible jinja2

我无法理解这一点,尽管这应该是一个微不足道的问题。

我使用Ansible(和Jinja模板)来构建模板,我有一个字典列表(这里显示为JSON):

"datacenters": [{
    "description": "Main Datacenter", 
    "name": "main"
}, {
    "description": "Secondaty Datacenter", 
    "name": "secondary"
}]

我想按名称过滤打印描述。在我的模板中,我可以到达这里:

{{ datacenters | selectattr("name", "equalto", "main") | list | first | to_nice_json }}

带输出:

{
    "description": "Main Datacenter",
    "name": "main"           
}

但我无法获得description。例如,当我使用:

{{ datacenters | selectattr("name", "equalto", "main") | list | first | attr("description") }}

我明白了:

AnsibleUndefinedVariable: 'unicode object' has no attribute 'description'

我发现此链接https://github.com/ansible/ansible/issues/19356在Google上搜索错误,但我没有从广告资源中加载变量。 知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您可以对管道的结果进行分组:

{{ (datacenters | selectattr("name", "equalto", "main") | list | first).description }}

答案 1 :(得分:0)

我使它工作,但使用解决方法,所以任何能够提供单行解决方案的人都会受到欢迎。

这是解决方法。在模板中,我使用了一组:

{% set temp = datacenters | selectattr("name", "equalto", "main") | list | first %}
{{ temp["description"] }}

哪个有效,但我不明白为什么它不应该使用attr

在一行中工作