lou*_*ong 5 json ansible jmespath
我有一个看起来像这样的源 json 文档:
# Source json
{
"nics": {
"vlan_internal": {
"mac": "aa:aa:aa:aa:aa:aa"
},
"vlan_external": {
"mac": "aa:aa:aa:aa:aa:bb"
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用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"
}
Run Code Online (Sandbox Code Playgroud)
似乎我应该使用某种类型的多选哈希,但我找不到将 vlan 名称(它们是源 json 文档中的哈希键,而不是哈希值)放入输出 json 文档的好方法。
我不会提前知道 vlan 的名称,所以我不能硬编码vlan_internal或vlan_external进入 jmespath 表达式。
我最接近的是这个 jmespath 表达式:
nics.{ vlans: keys(@), macs: *.mac }
Run Code Online (Sandbox Code Playgroud)
这会产生一个几乎有用的输出 json 文档:
{
"vlans": [
"vlan_internal",
"vlan_external"
],
"macs": [
"aa:aa:aa:aa:aa:aa",
"aa:aa:aa:aa:aa:bb"
]
}
Run Code Online (Sandbox Code Playgroud)
如果保证 vlan 名称列表的顺序和 mac 地址列表的顺序与源 json 文档的顺序相同,这对我有用。但是 jmespath 规范非常清楚地表明该keys()函数不需要以任何特定顺序返回结果。由于我需要将 vlan 名称与正确的 mac 地址配对,这对我不起作用。
有人知道用 jmespath 实现这一目标的方法吗?
小智 0
首先,我不确定你是否应该经历所有这些麻烦。如果您不确定要获得的女巫密钥,那么您可能会迭代整个 json,因此您知道您的item密钥。
然而,如果您只想导出新的 json,我无法找到使用本机 JMESPath 来执行此操作的方法。相反,我使用了 ansiblewith_dict循环,如下所示:
- name: Create new nic_dict json
set_fact:
nic_dict: "{{ {item.key: item.value.mac} | combine(nic_dict | default({})) }}"
with_dict: "{{ nics }}"
Run Code Online (Sandbox Code Playgroud)
现在您可以使用nic_dict如下所示:
"nic_dict": {
"vlan_external": "aa:aa:aa:aa:aa:bb",
"vlan_internal": "aa:aa:aa:aa:aa:aa"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
558 次 |
| 最近记录: |