jinja2 – Ansible:通过其属性过滤列表

我在Ansible中注册了名为“network”的变量:

{
    "addresses": {
        "private_ext": [
            {
                "type": "fixed",
                "addr": "172.16.2.100"
            }
        ],
        "private_man": [
            {
                "type": "fixed",
                "addr": "172.16.1.100"
            },
            {
                "type": "floating",
                "addr": "10.90.80.10"
            }
        ]
    }
}

是否可以使用type =“floating”获取IP地址(“addr”)?

- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}

我知道语法错了,但你得到了这个想法。

要过滤列表,您可以使用selectattr filterequalto filter

network.addresses.private_man | selectattr("type", "equalto", "fixed")

虽然这在理论上应该工作,实际上对大多数人来说,它从来没有为我做过。我使用过的任何可能的版本(最多2.1)都不知道等同的过滤器。我从来没有想过为什么,但得到了一个解决方案:可以也是has the filters match and search,它采用正则表达式:

match will require a complete match in the string, while search will require a match inside of the string.

network.addresses.private_man | selectattr("type", "match", "^fixed$")

要将列表的列表减少到字符串列表,因此您只能收到addr字段的列表,您可以使用map filter

... | map(attribute='addr') | list

或者如果你想要一个逗号分隔的字符串:

... | map(attribute='addr') | join(',')

结合起来,看起来就像这样。

- debug: msg={{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | join(',') }}
http://stackoverflow.com/questions/31895602/ansible-filter-a-list-by-its-attributes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:jinja2 – Ansible:通过其属性过滤列表