使用sed或ansible在docker daemon.json中的“[”后插入或替换

myss37ts  于 2023-03-20  发布在  Docker
关注(0)|答案(3)|浏览(117)

文件名:docker daemon.json位置:/etc/停靠器/守护进程. json内容:

{
    "insecure-registries": [
        "registry1.com:5001",
        "registry2.com"
    ],
    "storage-driver": "overlay2"
}

想把上面的内容做成这样

{
    "insecure-registries": [
        "registry0.com:5000",
        "registry1.com:5001",
        "registry2.com"
    ],
    "storage-driver": "overlay2"
}

{
    "insecure-registries": ["registry0.com:5000",
        "registry1.com:5001",
        "registry2.com"
    ],
    "storage-driver": "overlay2"
}

尝试sed将[替换为["registry0.com:5000",,但没有成功。我们正在使用ansible,不幸的是,迄今为止,他们的模块(如insertafterlineinfile)都没有取得成功。无论是ansible方法还是bash方法都可以。感谢帮助。

nfeuvbwi

nfeuvbwi1#

编辑JSON文件的最佳实践方法是使用支持JSON的工具,在本例中,jq就是这样一个工具,它专门构建为易于在shell中使用。

jq '."insecure-registries" |= [ "registry0.com:5000" ] + .' \
  <in.json >out.json

如果手头没有jq,Python也有一个完全兼容的JSON库,从bash使用它非常简单:

#!/usr/bin/env bash
prepend_registry() {
  python -c '
import sys, json
data = json.load(sys.stdin)
data["insecure-registries"] = sys.argv[1:] + data["insecure-registries"]
json.dump(data, sys.stdout)
' "$@"
}

prepend_registry registry0.com:5000 <in.json >out.json
xu3bshqb

xu3bshqb2#

在Ansible中,包含该文件并将字典存储到变量 daemon 中。

- include_vars:
        file: /tmp/daemon.json
        name: daemon

给予

daemon:
    insecure-registries:
      - registry1.com:5001
      - registry2.com
    storage-driver: overlay2

将项目添加到列表并 * 合并 * 字典

- set_fact:
        daemon: "{{ daemon|combine({'insecure-registries': ir}) }}"
      vars:
        ir_add:
          - registry0.com:5000
        ir: "{{ ir_add + daemon['insecure-registries'] }}"

,或使用参数 list_merge

- set_fact:
        daemon: "{{ daemon|combine({'insecure-registries': ir_add},
                                   list_merge='prepend') }}"
      vars:
        ir_add:
          - registry0.com:5000

两个选项给予结果相同

daemon:
    insecure-registries:
      - registry0.com:5000
      - registry1.com:5001
      - registry2.com
    storage-driver: overlay2

要使任务幂等(仅将项目前置一次),请设置参数list_merge='prepend_rp'
一般来说,字典中可能会有更多的属性声明了额外的项。例如,

daemon_add:
    insecure-registries:
      - registry0.com:5000

在这种情况下,可以迭代字典

- set_fact:
        daemon: "{{ daemon|combine({item.key: val_add}) }}"
      loop: "{{ daemon_add|dict2items }}"
      vars:
        val_add: "{{ item.value + daemon[item.key] }}"

,或使用参数 list_merge

- set_fact:
        daemon: "{{ [daemon, daemon_add]|combine(list_merge='prepend') }}"

创建模板

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

并更新文件

- template:
        src: daemon.json.j2
        dest: /tmp/daemon.json

给予

shell> cat /tmp/daemon.json
{
    "insecure-registries": [
        "registry0.com:5000",
        "registry1.com:5001",
        "registry2.com"
    ],
    "storage-driver": "overlay2"
}

完整的测试行动手册示例

- hosts: localhost

  vars:

    daemon_add:
      insecure-registries:
        - registry0.com:5000

  tasks:

    - include_vars:
        file: /tmp/daemon.json
        name: daemon

    - set_fact:
        daemon: "{{ [daemon, daemon_add]|combine(list_merge='prepend_rp') }}"

    - copy:
        dest: /tmp/daemon.json
        content: |
          {{ daemon|to_nice_json }}
dvtswwa3

dvtswwa33#

你可以试试这个

sed -e '/insecure-registries/a\
"registry0.com:5000",' daemon.json

sed -e '/registry1/i\
"registry0.com:5000",' daemon.json

可以通过在指定行之前或之后添加行来实现此目的。

相关问题