为了清理我的客户端的木偶Hiera数据,大幅减lessPuppet清单中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
所以,而不是有X hiera()调用,我只有一个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)
这里的问题是,我无法find一种方式来提供所有键的默认值以一个干净简洁的方式。 如果在层次结构中找不到hiera_hash(key_to_be_searched, default_hash)将返回hiera_hash(key_to_be_searched, default_hash)的值。 但是你不能检查散列(在层次结构中find)是否包含(至less) default_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',
但是,据我所知,这不是一个可能性。 这个例子中木偶返回的是:
foo => 'bar', bar => 'baz',
有没有人可以解决这个问题? 在当前的环境中,我估计通过按照我想要的方式重组数据,在Puppet游戏中Hiera呼叫的数量将减less五到十倍。 它也使方式更清洁的代码。
您需要stdlib模块的散列mergefunction。
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, {}) )
只有当您需要从多个层次结构层次深度合并散列时,才应该使用hiera_hash 。 我想你的方法,你确实需要。
一个简单的键列表通常更容易处理,而且它也是利用自动类参数查找的唯一方法。 坚持标准的数据布局是安全的做法。
是的,可能会有性能影响。