文件名: 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,不幸的是,到目前为止,他们的模块都没有像insertafter
lineinfile
富有成效。无论是 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
您可以通过在指定行之前或之后添加一行来实现目标。