Ansible合并JSON对象

时间:2019-03-24 08:12:24

标签: ansible

我需要根据第一个对象键合并两个JSON对象

object1 = {
 "params" : {
    "type": ["type1", "type2"],
    "requeststate": []
 }        
}

object2 = {
 "params" : {
    "type": ["type2", "type3", "type4"],
    "requeststate": ["Original", "Revised" ],
    "responsestate": ["Approved" ]
 }        
}

我需要基于第一个对象键合并两个对象,并且我的输出应如下所示

mergedobject = {
 "params" : {
    "type": ["type1", "type2", "type3", "type4"],
    "requeststate": ["Original", "Revised"]
 }        
}

我搜索了我的案子,但没有发现太多细节 请让我知道Ansible可能与

我可以用

合并数组
  set_fact:
    mergedrequeststate: "{{ object1.params.requeststate +  object2.params.requeststate  }}"

但是我的案例涉及超过15个params对象,因此我无法声明所有param对象。将来它还会增长,如果可能,我需要处理。

如果您需要更多详细信息,请发表评论。 感谢您的支持

2 个答案:

答案 0 :(得分:1)

使用combine过滤器。

- set_fact:
    mergedobject: "{{ object1.params | combine (object2.params) }}"

答案 1 :(得分:1)

该需求已被很好地描述,我只想添加您想要合并键并从2个对象中获取unique值(如果不是这种情况,请注意union过滤器在下面的PB中)。此外,您的示例变量假设我们要合并objectX.params下的键。

没有进一步的要求,这是一个PB,它将帮助您前进。第一步是调试,以显示object1.params拥有的所有键,然后是一个循环以合并两个对象的值,然后是最终打印。

PB:

---
- hosts: localhost
  gather_facts: false
  vars:
    object1:
      params:
        type:
        - type1
        - type2
        requeststate: []
    object2:
      params:
        type:
        - type2
        - type3
        - type4
        requeststate:
        - Original
        - Revised
        responsestate:
        - Approved

  tasks:

  - name: print all the keys in the object1.params variable
    debug:
      msg: "{{ object1['params'].keys() | list }}"

  - name: for each key, merge from the 2 variables
    set_fact:
      mergedobj: "{{ mergedobj|default({}) | combine({item: object1['params'][item] | union(object2['params'][item]) }) }}"
    with_items:
    - "{{ object1['params'].keys() | list }}"

  - name: print final result
    debug:
      var: mergedobj

执行结果:

[http_offline@greenhat-29 tests]$ ansible-playbook test.yml 

PLAY [localhost] *******************************************************************************************************************************************************************************************************

TASK [print all the keys in the object1.params variable] ***************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "type",
        "requeststate"
    ]
}

TASK [for each key, merge from the 2 variables] ************************************************************************************************************************************************************************
ok: [localhost] => (item=type)
ok: [localhost] => (item=requeststate)

TASK [print final result] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "mergedobj": {
        "requeststate": [
            "Original",
            "Revised"
        ],
        "type": [
            "type1",
            "type2",
            "type3",
            "type4"
        ]
    }
}

PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0   

[http_offline@greenhat-29 tests]$ 

希望有帮助