我有一个源json文档,如下所示:
# Source json
{
"nics": {
"vlan_internal": {
"mac": "aa:aa:aa:aa:aa:aa"
},
"vlan_external": {
"mac": "aa:aa:aa:aa:aa:bb"
}
}
}
使用ansible的json_query
过滤器(使用jmespath),我想操作上面的json,以便输出json文档如下所示:
# Desired output json
{
"vlan_internal": "aa:aa:aa:aa:aa:aa",
"vlan_external": "aa:aa:aa:aa:aa:ab"
}
似乎我应该使用某种多选散列,但我找不到一个好的方法来获取输出json doc中的vlan名称(源json doc中的散列键,而不是散列值)。
我不知道前面的vlan的名字,所以我不能将vlan_internal
或vlan_external
硬编码到jmespath表达式中。
我最接近的是这个jmespath表达式:
nics.{ vlans: keys(@), macs: *.mac }
这导致输出json doc几乎是有用的:
{
"vlans": [
"vlan_internal",
"vlan_external"
],
"macs": [
"aa:aa:aa:aa:aa:aa",
"aa:aa:aa:aa:aa:bb"
]
}
如果保证vlan名称列表的顺序和mac地址列表的顺序与源json文档的顺序相同,这对我有用。但jmespath规范清楚地表明,keys()
函数不需要以任何特定顺序返回结果。由于我需要将vlan名称与正确的mac地址配对,这对我来说不起作用。
有人知道用jmespath实现这个目标的方法吗?
首先,我不确定你是否应该经历所有那些蠢事。如果你不确定女巫的钥匙,那么你可以通过你的整个json迭代,所以,你知道你的item
钥匙。
不过,如果您只想导出一个新的json,我无法找到使用本机JMESPath的方法。相反,我使用了一个ansible with_dict
循环如下:
- name: Create new nic_dict json
set_fact:
nic_dict: "{{ {item.key: item.value.mac} | combine(nic_dict | default({})) }}"
with_dict: "{{ nics }}"
现在你可以使用看起来像这样的nic_dict
:
"nic_dict": {
"vlan_external": "aa:aa:aa:aa:aa:bb",
"vlan_internal": "aa:aa:aa:aa:aa:aa"
}