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

为了清理我的客户端的木偶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, {}) ) 

注1

只有当您需要从多个层次结构层次深度合并散列时,才应该使用hiera_hash 。 我想你的方法,你确实需要。

笔记2

一个简单的键列表通常更容易处理,而且它也是利用自动类参数查找的唯一方法。 坚持标准的数据布局是安全的做法。

是的,可能会有性能影响。