ansible - 如何在ansible中的json中合并具有相同键的值
问题描述
我想根据特定的 Key 值将一个值从 1 个 json 合并到另一个。请找到下面的代码,它在合并时只给了我一个空数组。主要问题是gp_value var 有一个空数组。我想将gpfinalgpid从gpidmgmtfinal.json合并到匹配gpfinalnet和networkId值的gp-test.json 。
我尝试在 gp_value 中添加First ,但这会引发错误,提示No first item,sequence is empty
tasks:
- name: Combine GP
vars:
gplist: "{{ lookup('file', 'gpidmgmtfinal.json') | from_json }}"
gpconf: "{{ lookup('file', 'gp-test.json') | from_json }}"
gp: >-
{{
gplist
| json_query('results[*].ansible_facts[]')
}}
gp_value: >-
{{
gp
| selectattr('gpfinalnet', '==', item.networkId)
| map(attribute='gpfinalgpid')
| list
| default(None)
}}
set_fact:
value: "{{ gp_value }}"
result: >-
{{
result | default([])
+
[item | combine({'gpid': gp_value})]
}}
loop: "{{ gpconf }}"
gplist JSON:
{
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_facts": {
"gpfinalgpid": "101",
"gpfinalnet": "L_456789 "
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": [
{
"gpmgmtcurrent": {
"L_456789": [
"102"
]
}
},
{
"L_456789": [
"101"
]
}
]
},
{
"ansible_facts": {
"gpfinalgpid": "103",
"gpfinalnet": "N_11447788 "
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": [
{
"gpmgmtcurrent": {
"N_11447788": [
"101"
]
}
},
{
"N_11447788": [
"103"
]
}
]
}
],
"skipped": false
}
gpconf JSON:
[
{
"name": "MGMT",
"applianceIp": "2.2.2.2",
"groupPolicyId": "100",
"networkId": "L_456789",
"subnet": "2.2.2.1/28"
},
{
"name": "MGMT",
"applianceIp": "1.1.1.2",
"groupPolicyId": "101",
"networkId": "N_11447788",
"subnet": "1.1.1.1/28"
} ]
当前输出:带有键gpid但带有值而不是空数组的新行。
{
"applianceIp": "1.1.1.2",
"gpid": [],
"groupPolicyId": "101",
"name": "MGMT",
"networkId": "N_11447788",
"subnet": "1.1.1.1/28"
}
预期输出:
{
"applianceIp": "1.1.1.2",
"gpid": 103,
"groupPolicyId": "101",
"name": "MGMT",
"networkId": "N_11447788",
"subnet": "1.1.1.1/28"
}
解决方案
这是我的一个基本错误。我在 gplist json 中有一个额外的空间用于gpfinalnet。删除多余的空间后,一切正常。
有额外的空间
"gpfinalnet": "N_11447788 "
没有额外的空间:
"gpfinalnet": "N_11447788"
推荐阅读
- xslt - XSL - 使所有具有命名空间的节点值在 CDATA 部分中可用
- php - PHPMailer 在寻找不在我的代码中的 PHPMailer\PHPMailer\Exception 时抛出错误?
- reactjs - 受保护的路由问题从 react-router-redux 切换到 connected-react-router
- php - Class CacheItemPoolInterface not Found Symfony
- reactjs - React map - 控制台日志有效..但不在 HTML 中返回值?
- python - pdflatex 在大量数字后挂起
- c# - FileSystemWacher 正在锁定一些文件
- jquery - Zendesk API 无效响应
- java - 如何重启 Kubernetes 服务的多个 Spring Boot 应用程序实例
- objective-c - 嵌套 NSMutableDictionary 对象的 valueForKeyPath 失败