Как объединить значения с одним и тем же ключом в json в ansible

#ansible #jinja2 #ansible-2.x

Вопрос:

Я хотел бы объединить значение из 1 json в другое на основе определенного значения ключа. Пожалуйста, найдите ниже код, который дает мне только пустой массив при слиянии. Основная проблема заключается в том, что gp_value var имеет пустой массив. Я хотел бы объединить gpfinalgpid из gpidmgmtfinal.json в gp-test.json, соответствующий значению gpfinalnet и networkId.

Я попытался добавить сначала значение gp_value, но это выдает ошибку, в которой говорится, что первого элемента нет, последовательность пуста

 tasks:  - name: Combine GP  vars:  gplist: "{{ lookup('file', 'gpidmgmtfinal.json') | from_json }}"  gpconf: "{{ lookup('file', 'gp-test.json') | from_json }}"  gp: gt;-  {{  gplist   | json_query('results[*].ansible_facts[]')  }}  gp_value: gt;-  {{  gp  | selectattr('gpfinalnet', '==', item.networkId)  | map(attribute='gpfinalgpid')  | list  | default(None)  }}  set_fact:  value: "{{ gp_value }}"  result: gt;-  {{   result | default([])     [item | combine({'gpid': gp_value})]  }}  loop: "{{ gpconf }}"  

JSON gplist:

 {  "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"  }  

Ответ №1:

Это была основная ошибка с моей стороны. У меня было дополнительное место в json gplist для gpfinalnet. после удаления дополнительного места все работает нормально.

С дополнительным пространством

 "gpfinalnet": "N_11447788 "  

Без дополнительного места:

 "gpfinalnet": "N_11447788"