Объединить два документа JSON вместе - PullRequest
0 голосов
/ 02 января 2019

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

Ответы [ 2 ]

0 голосов
/ 02 января 2019

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

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

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

0 голосов
/ 02 января 2019

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

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