Я пытаюсь добавить 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.

Это тот код, который вы ищете?
- 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"
}
}
}
Для полноты картины, это также возможно с jq, просто add с двумя json-файлами:
jq -s 'add' credHelpers.json config.json
Фильтр add принимает в качестве входных данных массив и производит в качестве выходных данных элементы массива, сложенные вместе, как jqдокументация говорит. Кроме того, вам понадобится опция командной строки --slurp/-s, которая превращает весь входной поток в большой массив и запускает фильтр только один раз.
Мне нравится add. Оно работает. Попробую использовать Ansible-нативное решение (меньше зависимостей), и тогда я выберу победителя.
Попробую это и скоро приму решение.