我有一个字典列表,其中每个字典都有相同的键,只是不同的值。我可以循环遍历列表并获取我想要的“ip”属性,但它是一个很大的列表,并且想知道是否没有可以更好地工作的查找命令。这是该列表的一个小示例:
"current": [
{
"fvSubnet": {
"attributes": {
"annotation": "",
"childAction": "",
"configIssues": "",
"ctrl": "",
"debugMessage": "",
"descr": "",
"dn": "uni/tn-MYBD/BD-VLAN_10/subnet-[114.66.71.17/28]",
"extMngdBy": "",
"ip": "114.66.71.17/28",
"ipDPLearning": "enabled",
"lcOwn": "local",
"modTs": "2023-07-11T08:18:19.497+00:00",
"monPolDn": "uni/tn-common/monepg-default",
"name": "",
"nameAlias": "",
"preferred": "yes",
"scope": "public",
"status": "",
"uid": "19044",
"userdom": ":all:",
"virtual": "yes"
}
}
},
{
"fvSubnet": {
"attributes": {
"annotation": "",
"childAction": "",
"configIssues": "",
"ctrl": "nd",
"debugMessage": "",
"descr": "",
"dn": "uni/tn-MYBD/BD-VLAN_20/subnet-[1008:125:0:e56::1/64]",
"extMngdBy": "",
"ip": "1008:125:0:e56::1/64",
"ipDPLearning": "enabled",
"lcOwn": "local",
"modTs": "2023-07-11T08:18:19.497+00:00",
"monPolDn": "uni/tn-common/monepg-default",
"name": "",
"nameAlias": "",
"preferred": "no",
"scope": "public",
"status": "",
"uid": "19044",
"userdom": ":all:",
"virtual": "no"
}
}
}
]
我只对每个字典中的“ip”属性感兴趣。我可以进行查找并获取所有内容,还是需要循环遍历字典列表?
任何不需要在数据上运行模块的数据转换都可以作为过滤表达式更有效地完成。
为了方便起见,为表达式创建一个新变量(尽管想出一个更好的名称):
Jinja 内置的地图过滤器只能为您获取一个属性,因此将一系列字典变成一个列表。不太明显的是,点符号可用于查看字典的字典。比链接多个映射函数更紧凑的语法。
转储 fvSubnet_ip 确实会导致
如果还需要基于其他属性进行过滤,请考虑另一个内置过滤器selectattr。首先选择哪个对象,然后提取您需要的属性。这就是 Jinja 过滤器可以链接在一起的原因。
由于这些是 IP 子网,请注意 ipaddr 系列过滤器的存在是为了做有用的事情。
ansible-doc -t filter ipaddr
您可以使用
json_query
过滤器,它使用JMESPath来提取 JSON 值。请注意,您必须
jmespath
在主机上安装。您可以pip
为此使用:然后我们可以使用下面的模板:
使用您的数据进行调试手册示例:
输出: