请问Ansible:按其属性筛选列表

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"
            }
        ]
    }
}

是否有可能得到这样的IP地址(“addr”)类型=“浮动”?

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

我知道语法是错的,但你明白。


小怪兽爱吃肉
浏览 374回答 3
3回答

慕标5832272

若要筛选数据集列表,可以使用选择塔特滤波器连同等距试验:network.addresses.private_man | selectattr("type", "equalto", "fixed")以上要求Jinja2v2.8或更高版本(而不管是Ansible版本)。也是不可接受的有测试match和search,其中接受正则表达式:match将需要字符串中的完全匹配,而search将需要字符串内部的匹配。network.addresses.private_man | selectattr("type", "match", "^fixed$")若要将数据集列表缩减为字符串列表,则只能获得addr字段,您可以使用MAP滤波器:... | map(attribute='addr') | list或者如果您想要一个逗号分隔的字符串:... | map(attribute='addr') | join(',')加起来看上去会是这样。- debug: msg={{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | join(',') }}

慕哥9229398

不一定更好,但是既然有选择是很好的,下面是如何使用金加声明:- debug:     msg: "{% for address in network.addresses.private_man %}\         {% if address.type == 'fixed' %}\           {{ address.addr }}\         {% endif %}\       {% endfor %}"或者如果你想把它放在一条线上:- debug:     msg: "{% for address in network.addresses.private_man if address.type == 'fixed' %}{{ address.addr }}{% endfor %}"返回:ok: [localhost] => {     "msg": "172.16.1.100" }
打开App,查看更多内容
随时随地看视频慕课网APP