Puppet - 返回 hiera 哈希的深度合并查找 default_value

Puppet - deep merge lookup default_value with hiera hash returned

我正在尝试将查找 'default_value' 或 'default_values_hash' 与从查找返回的散列深度合并。它不会合并,并且 default_value 只有在根本找不到 hiera 标题时才会生效。我无法在此处设置资源默认值,因为稍后会处理返回的值,而不是实际的资源键。

我尝试了多种变体,包括 'default_value'、'default_values_hash'。我正在寻找一种方法来在清单中设置一个默认哈希值,并让它与 hiera 深度合并以创建一个更大的哈希值。

清单:

class test (
Hash     $result = lookup('test::my_hash', {merge => 'deep', default_values_hash => {foo => 'bar', this => 'that', him => 'her'}}),
){

notice($result)

}

include test

希拉:

---
test::my_hash:
foo:  'nobar'
this: 'then'

期望的结果(深度合并):

{ foo => 'nobar', this => 'then', him => 'her' }

实际结果(returns 仅 hiera 哈希):

{ foo => 'nobar', 这 => 'then' }

更新:

我用下面的代码让它工作。如果有人有更好的解决方案,仍然感兴趣。

class test (

$stuff = {
foo  => 'bar',
this => 'that',
him  => 'her'
},
Hash     $result = deep_merge($stuff, lookup('test::my_hash')),

){

notice($result)

}

不幸的是,这就是 lookup 的工作方式。仅当未找到其他值时才使用默认值。 documentation for the default in lookup 表示

If present, lookup returns this when it can’t find a normal value. Default values are never merged with found values.

您使用 stdlib 中的 deep_merge 函数的版本似乎是最佳解决方案。

class foo {
  $default_foo_attribute = {
    foo  => 'bar',
    this => 'that',
    him  => 'her',
  }

  $attribute = deep_merge($default_foo_attribute,
                          lookup('foo::attribute',
                                 Hash[String, String],
                                 'deep',
                                 {})
  notice($attribute)
}