Ansible:从字典列表中提取每个字典的指定键值
Ansible:从字典列表中提取每个字典的指定键值
嘿,我懂你这种困扰——面对一大串结构一致的字典列表,手动循环挨个取ip值不仅麻烦,数据量大的时候效率也不高。其实Ansible里有几个现成的高效过滤器可以直接搞定这个需求,不用写循环!
方法一:用map+attribute过滤器(直观易用)
这个方法是最直接的,专门用来从列表的每个元素中提取指定属性值。针对你的数据结构,你可以这么写:
- name: 提取所有子网IP debug: msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | list }}"
简单解释下:
map(attribute='fvSubnet.attributes.ip')会遍历current列表里的每一个字典,自动沿着fvSubnet -> attributes -> ip的路径取出对应的值- 最后用
list把处理后的结果转换成一个标准列表,方便后续使用
方法二:用json_query过滤器(灵活强大)
如果你需要处理更复杂的嵌套结构查询,或者之后要加筛选条件,json_query会更适合,它用的是JMESPath查询语法。针对你的场景,代码如下:
- name: 用JMESPath提取IP debug: msg: "{{ current | json_query('[*].fvSubnet.attributes.ip') }}"
这里的[*]表示遍历列表中的所有元素,后面的.fvSubnet.attributes.ip就是要提取的字段路径,一行代码就能拿到所有IP。
额外小技巧
如果你的列表里有重复的IP,还可以结合unique过滤器去重:
msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | list | unique }}"
要是只想提取满足特定条件的IP(比如包含某段地址),可以再加个select过滤器:
msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | select('search', '114.66.*') | list }}"
这两种方法都比手动循环高效得多,Ansible的过滤器都是经过优化的,处理大列表时性能优势很明显,而且代码更简洁易读~
备注:内容来源于stack exchange,提问作者Jolan
相关产品推荐
相关产品推荐

