Ansible -Слияние двух вложенных json файлов в один файл с использованием совпадения ключей - PullRequest
1 голос
/ 21 марта 2020

У меня есть два json и я хочу добавить одно в другое и сохранить их в одном файле. Я сделал набор фактов, чтобы прочитать значения и поместить их в переменную, используя следующее:

- name: Set json combine to add new event
  set_fact:
     event_json_create: "{{ lookup('file', 'event_template.json') }}" 

- name: Set json combine to get the existing list of events
  set_fact:
     event_json_existing: "{{ lookup('file', 'notification.json') }}" 

Теперь я хочу добавить event_json_create к event_json_existing.

Event_json_create выглядит следующим образом:

"event_json_create": {
    "LambdaFunctionConfigurations": [{
        "LambdaFunctionArn": "arn:aws:lambda:us-east-1:*******:function:xyz"
    }]
        }

Event_json_existing выглядит следующим образом:

 "event_json_existing": {
            "LambdaFunctionConfigurations": [{
                    "LambdaFunctionArn": "arn:aws:lambda:us-east-1:******:function:abc"
                }],
    "TopicConfigurations": [{
        "TopicArn": "arn:aws:sns:us-east-1:xxxxxx:crt"
    }]
        }

Как добавить два json в ansible, гарантируя, что оба json находятся в основной группе: LambdaFunctionConfigurations и сохранить оставшееся содержимое TopicConfiguration, затем я могу записать это в файл json. Поэтому на выходе я ожидаю:

{
    "LambdaFunctionConfigurations": [
        {
           "LambdaFunctionArn": "arn:aws:lambda:us-east-1:*******:function:xyz"
        },
        {
           "LambdaFunctionArn": "arn:aws:lambda:us-east-1:*******:function:abc"
        }
       ],  
    "TopicConfigurations": [
     {
        "TopicArn": "arn:aws:sns:us-east-1:xxxxxx:crt"
    }
    ]
}

Пожалуйста, помогите!

1 Ответ

1 голос
/ 21 марта 2020

(В качестве примера Как создать минимальный воспроизводимый пример давайте преобразуем вопрос)

Q: С учетом словарей ниже

create:
  dict1:
    - key1: value1
existing:
  dict1:
    - key1: value2
  dict2:
    - key2: value3

получить вывод

expected:
  dict1:
    - key1: value1
    - key1: value2
  dict2:
    - key2: value3

Записать вывод в файл в JSON


A: Приведенные ниже задачи
    - set_fact:
        events: "{{ events|default({})|
                    combine({item: existing[item]|default([]) +
                                   create[item]|default([])}) }}"
      loop: "{{ (create.keys()|list + existing.keys()|list)|unique }}"
    - template:
        src: events.json.j2
        dest: events.json

с шаблоном

shell> cat events.json.j2
{{ events|to_nice_json }}

Да

shell> cat events.json
{
    "dict1": [
        {
            "key1": "value2"
        },
        {
            "key1": "value1"
        }
    ],
    "dict2": [
        {
            "key2": "value3"
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...