如何在 hiera_hash() 调用中返回默认哈希键?

如何在 hiera_hash() 调用中返回默认哈希键?

为了清理客户的 Hiera 数据以供 Puppet 使用,并大幅减少 Puppet 清单中的 Hiera 调用次数,我正在更改以下结构:

some_name::key1: a_value_1
some_name::key2: a_value_2
[...]
some_name::keyX: a_value_X

进入

some_name:
  key1: a_value_1
  key2: a_value_2
  [...]
  keyX: a_value_X

这样hiera()我就不用调用 X 次了,而只需hiera_hash()调用一次。这很完美,直到你遇到这样的情况:

# some_manifest.pp

hiera(some_name::key1, default_value_1)
hiera(some_name::key2, default_value_2)
[...]
hiera(some_name::keyX, default_value_X)

这里的问题是,我找不到一种简洁明了的方式为所有键提供默认值。如果在层次结构中找不到hiera_hash(key_to_be_searched, default_hash),则返回的值。但您无法让它检查哈希(在层次结构中找到)是否(至少)包含 中定义的所有键。default_hashkey_to_be_searcheddefault_hash

例如,如果我有以下 hiera 数据:

test:
  foo: bar
  bar: baz

与这段 DSL 一起:

$test_default = {
  foo => '1',
  bar => '2',
  baz => 'foo',
}
$test = hiera_hash(test, $test_default)

我期望(或者说想要)$test包含:

  foo => 'bar',
  bar => 'baz',
  baz => 'foo',

但据我所知,这是不可能的。Puppet 在此示例中返回的内容如下:

  foo => 'bar',
  bar => 'baz',

这里有谁能解决这个问题吗?在当前环境中,我估计通过以我想要的方式重组数据,Puppet 运行中的 Hiera 调用次数可以减少五到十倍。这也使代码更加简洁。

答案1

您需要merge来自标准库模块。

merge:将两个或多个哈希合并在一起并返回结果哈希。

例子:

$hash1 = {'one' => 1, 'two' => 2}
$hash2 = {'two' => 'dos', 'three' => 'tres'}
$merged_hash = merge($hash1, $hash2)
# The resulting hash is equivalent to:
# $merged_hash =  {'one' => 1, 'two' => 'dos', 'three' => 'tres'}

当存在重复的键时,最右边哈希中的键将“获胜”。

所以你的情况

$test = merge( $test_default, hiera_hash(test, {}) )

注 1

hiera_hash仅当您需要深度合并来自多个层次结构的哈希时才应使用。我想,使用您的方法,您确实想要这样做。

笔记2

扁平的键列表通常更容易处理,而且它也是利用自动类参数查找。遵守标准数据布局是一种安全的做法。

是的,这可能会对性能产生影响。

相关内容