#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"