我在YAML文件中有这样的模式:
X:
- B: 1
C:
c1: 1
c2: 0
D
d1: 9
d2: 27
- B: 1
C:
c1: 2
c2: 0
D
d1: 9
d2: 27
- B: 1
C:
c1: 3
c2: 0
D
d1: 9
d2: 27
在实践中,对于列表中的每个元素,都有许多键(不仅仅是B
、C
和D
(。列表中每个元素的内容几乎相同——只有C
中的c1
发生变化。
有没有一种方法可以使用锚点来避免重新写入列表中的每个元素,比如定义一些模板列表元素,然后只修改c1
?
如果您的YAML实现支持合并键(有很多支持,但这不是必需的,因为它是YAML 1.1遗留下来的(,您可以执行
X:
- &a
B: 1
C:
c1: 1
c2: 0
D:
d1: 9
d2: 27
- <<: *a
C:
c1: 2
c2: 0
- <<: *a
C:
c1: 3
c2: 0
这会将第一个序列项中的键值对合并到其他项中,但会跳过C
,因为它被覆盖了。您不能跳过c1
,因为合并键不会合并新给定的C
的内容。
如果C
的实际不变内容较大,并且您不想重复,您可以额外进行
X:
- &a
B: 1
C:
<<: &b
c2: 0
c1: 1
D:
d1: 9
d2: 27
- <<: *a
C:
<<: *b
c1: 2
- <<: *a
C:
<<: *b
c1: 3
这是YAML唯一支持的模板工具。要执行更复杂的模板,您需要在YAML之上安装一个模板引擎。许多YAML重度用户,例如Ansible、SaltStack和其他用户,都使用一个来做这些事情。这取决于您的环境是否有可用的模板引擎。