为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小怪兽爱吃肉 2019-10-22 13:12:06
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" }}我知道语法是错的,但你明白。
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

若要筛选数据集列表,可以使用选择塔特滤波器连同等距试验:

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

以上要求Jinja2v2.8或更高版本(而不管是Ansible版本)。


也是不可接受的有测试matchsearch,其中接受正则表达式:

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(',') }}




查看完整回答
反对 回复 2019-10-23
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

不一定更好,但是既然有选择是很好的,下面是如何使用金加声明:

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



查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 369 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信