Puppet Hiera访问更特定文件中的全局对象

Puppet Hiera访问更特定文件中的全局对象,puppet,hiera,Puppet,Hiera,我正在努力理解hiera处理数据的方式,在我看来,使用frontmatter包含全局数据文件的普通yaml将更简单、更强大 在任何情况下,我都想实现以下目标: # global.yaml collection1: &collection1 foo: 1 collection2: &collection2 bar: 2 collection3: &collection3 baz: 3 # development_environment.yaml c

我正在努力理解hiera处理数据的方式,在我看来,使用frontmatter包含全局数据文件的普通yaml将更简单、更强大

在任何情况下,我都想实现以下目标:

# global.yaml
collection1: &collection1
    foo: 1
collection2: &collection2
    bar: 2
collection3: &collection3
    baz: 3

# development_environment.yaml
collection:
    <<: *collection1
    <<: *collection2

# production_environment.yaml
collection:
    <<: *collection2
    <<: *collection3
#global.yaml
集合1:&集合1
傅:1
集合2:&集合2
酒吧:2间
集合3:&集合3
巴兹:3
#发展与环境
收藏:

您可以通过手动加载集合列表并对其进行迭代来完成此操作:

# global.yaml
collection1:
    foo: 1
collection2:
    bar: 2
collection3:
    baz: 3

# development_environment.yaml
collection:
    - collection1
    - collection2

# production_environment.yaml
collection:
    - collection2
    - collection3
现在你可以这样写:

# this variable will contain something like ['collection1','collection2']
$collections = hiera('collection')
# Now get all the corresponding values
$hashparts = $collections.map |$r| { $x = hiera($r); $x } # [{"baz"=>3}, {"bar"=>2}]
# Now we merge all the parts
$hash = $hashparts.reduce |$a,$b| { $x = merge($a,$b); $x } # {"baz"=>3, "bar"=>2}
这很难看,但应该做你所期望的。关于
$x=function()的交易$x出现在这里是因为一个不幸的决定,即所有lambda函数都可以在任何上下文(语句或值)中使用,因此我们在解析时不知道“块”的最后一个“标记”是语句还是表达式