在docker daemon.json中使用sed或ansible插入或替换'['



文件名: docker daemon.json location:/etc/docker/daemon.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"
}

尝试用["registry0.com:5000",替换[但没有去。 我们正在使用 ansible,不幸的是,到目前为止,他们的模块都没有像insertafterlineinfile富有成效。无论是 ansible 方式还是 bash 方式都可以。感谢您的帮助。

编辑 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

在 Ansible 中,包含文件并将字典存储到变量守护程序中。例如

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

你可以试试这个

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

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

您可以通过在指定行之前或之后添加一行来实现目标。

最新更新