Объединить два документа JSON вместе

Я пытаюсь добавить JSON в существующий документ ~/.docker/config.json с помощью Ansible.

Документ 1 ~/.docker/config.json

{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "supercalifragilistic"
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/18.03.0-ce (windows)"
        }
}

Документ 2 credHelper.json

{
    "credHelpers": {
        "111111111111.dkr.ecr.us-east-1.amazonaws.com" : "ecr-login"
    }
}

Я провел некоторое время с jq, но не могу заставить его работать. Это результат jq.

jq -s '.' credHelpers.json config.json

[
  {
    "credHelpers": {
      "111111111111.dkr.ecr.us-east-1.amazonaws.com": "ecr-login"
    }
  },
  {
    "auths": {
      "https://index.docker.io/v1/": {
        "auth": "supercalifragilistic"
      }
    },
    "HttpHeaders": {
      "User-Agent": "Docker-Client/18.03.0-ce (windows)"
    }
  }
]

Я хочу вот что:

{
    "auths": {
            "https://index.docker.io/v1/": {
                    "auth": "supercalifragilistic"
            }
    },
    "HttpHeaders": {
            "User-Agent": "Docker-Client/18.03.0-ce (windows)"
    },
    "credHelpers": {
            "111111111111.dkr.ecr.us-east-1.amazonaws.com": "ecr-login"
    }
}

Надеюсь, я тоже смогу сделать этот идемпотент, чтобы слияние / присоединение не происходило рекурсивно при каждом запуске playbook.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
1 120
2

Ответы 2

Это тот код, который вы ищете?

    - set_fact:
        doc1: "{{ lookup('file', 'config.json') }}"
        doc2: "{{ lookup('file', 'credHelper.json') }}"
    - debug: msg = "{{ doc1 | combine(doc2) }}"



TASK [debug] **********************************************************
ok: [localhost] => {
    "msg": {
        "HttpHeaders": {
            "User-Agent": "Docker-Client/18.03.0-ce (windows)"
        }, 
        "auths": {
            "https://index.docker.io/v1/": {
                "auth": "supercalifragilistic"
            }
         }, 
         "credHelpers": {
            "111111111111.dkr.ecr.us-east-1.amazonaws.com": "ecr-login"
         }
    }
}

Попробую это и скоро приму решение.

Felipe Alvarez 05.01.2019 15:46

Для полноты картины, это также возможно с jq, просто add с двумя json-файлами:

jq -s 'add' credHelpers.json config.json

Фильтр add принимает в качестве входных данных массив и производит в качестве выходных данных элементы массива, сложенные вместе, как jqдокументация говорит. Кроме того, вам понадобится опция командной строки --slurp/-s, которая превращает весь входной поток в большой массив и запускает фильтр только один раз.

Мне нравится add. Оно работает. Попробую использовать Ansible-нативное решение (меньше зависимостей), и тогда я выберу победителя.

Felipe Alvarez 05.01.2019 15:46

Другие вопросы по теме