首页 > 解决方案 > 如何在ansible中的json中合并具有相同键的值

问题描述

我想根据特定的 Key 值将一个值从 1 个 json 合并到另一个。请找到下面的代码,它在合并时只给了我一个空数组。主要问题是gp_value var 有一个空数组。我想将gpfinalgpidgpidmgmtfinal.json合并到匹配gpfinalnetnetworkId值的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"
            }

标签: ansiblejinja2ansible-2.x

解决方案


这是我的一个基本错误。我在 gplist json 中有一个额外的空间用于gpfinalnet。删除多余的空间后,一切正常。

有额外的空间

"gpfinalnet": "N_11447788 "

没有额外的空间:

"gpfinalnet": "N_11447788"

推荐阅读