将两个JSON文档合并在一起

时间:2019-01-02 04:49:07

标签: json ansible jq idempotent

我正在尝试使用Ansible将一些JSON附加到现有~/.docker/config.json文档中。

文档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"
    }
}

我希望我也能使这个幂等,因此合并/联接不会在每次运行剧本时都递归地发生。

2 个答案:

答案 0 :(得分:1)

这是您要查找的代码吗?

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

答案 1 :(得分:1)

只需完成图片,jq,也可以add两个json文件,也可以做到这一点:

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

add过滤器将一个数组作为输入,并产生与jq documentation says相加的数组元素作为输出。另外,您需要使用--slurp/-s命令行选项,该选项会将整个输入流变成一个大数组,并只运行一次过滤器。