如何从另一个YAML锚点引用YAML锚点?

如何从另一个YAML锚点引用YAML锚点?,yaml,anchor,Yaml,Anchor,我有一个YAML文件,它有几个不同的键,我想为它们提供相同的值。此外,我希望此值可以轻松配置 有关我的具体用例,请参见下面的YAML: --- # Options for attribute_value att_value_1: &att_value_1 att_value_2: &att_value_2 # There could be more options... # This is where the constant is being set. attribute_

我有一个YAML文件,它有几个不同的键,我想为它们提供相同的值。此外,我希望此值可以轻松配置

有关我的具体用例,请参见下面的YAML:

--- 
# Options for attribute_value
att_value_1: &att_value_1
att_value_2: &att_value_2
# There could be more options...

# This is where the constant is being set.
attribute_value: &attribute_value *att_value1

items:
  - name: item1
    attributes:
      attribute_for_item1: *attribute_value
  - name: item2
    attributes:
      attribute_for_item2: *attribute_value
下面是一个简化的YAML,它演示了问题:

--- 
foo: &foo "Hello World!"
bar: &bar *foo
错误(它抱怨第一行上有“Hello World!”):

():分析第2行第1列的块映射时未找到所需的键
我希望价值传播

错误(它抱怨第一行上有“Hello World!”):

您必须告诉我们您正在使用哪个YAML实现。两者都正确地报告错误在第三行;第二行没问题

我希望价值传播

规范中没有支持这一期望的内容:

请注意,别名节点不得指定任何属性或内容,因为这些属性或内容在该节点第一次出现时已指定

属性是锚和标记。无法在别名节点上放置锚点,因为它已具有锚点

以你为例,

---
foo: &foo "Hello World!"
bar: &bar *foo
&bar
是完全多余的,因为您已经可以通过
*foo
引用
“Hello World”
节点,因此,引入
&bar
是没有意义的

回答您的问题:您不能从另一个YAML锚引用YAML锚,因为YAML锚不是节点。YAML表示一个图,即节点和有向边。锚定和别名用于多次引用同一节点(而不是复制您可能认为的值)。这也意味着YAML文件中的所有内容都是内容。没有变量声明这样的东西

看起来您对您的用例使用了错误的工具。要使用外部值配置YAML文件,通常需要使用模板引擎(例如SaltStack和Ansible use Jinja)并从模板生成YAML文件。您可以在另一个YAML文件中提供选项。这将清楚地将配置选项与内容分开

---
foo: &foo "Hello World!"
bar: &bar *foo