我想使用deep_merge
选项knockout_prefix从puppet中的hiera数组中删除条目。
# upper hierarchy
---
foo:
- a
- b
- c
# lower hierarchy
---
foo:
- '--b'
- y
- z
# expected result
foo => [a,c,y,z]
我正在使用当前的木偶4.x PC1安装。根据official documentation的Hiera层次结构配置是
[...] my hierarchy stuff omitted
:merge_behavior: deeper
:deep_merge_options:
:knockout_prefix: '--'
我的系统应该正确配置才能使用此功能:
$ hiera -v
3.0.6
$ /opt/puppetlabs/puppet/bin/gem list --local
*** LOCAL GEMS ***
activemodel (4.2.5)
activesupport (4.2.5)
bigdecimal (1.2.4)
builder (3.2.2)
bundler (1.10.6)
deep_merge (1.0.1)
facter (3.1.4)
[...]
我的错在哪里?
knockout_prefix
用于敲除特定键而不是数组中的值,就像你所拥有的那样。使用您的代码作为示例,这将是
# upper hierarchy
---
lookup_options:
foo:
merge:
strategy: deep
knockout_prefix: '--'
foo:
a: a
b: b
c: c
# lower hierarchy
---
foo:
b: --
y: y
z: z
# expected result
foo = { 'a' => 'a', 'c' => 'c', 'y' => 'y', 'z' => 'z' }
Hiera 3合并行为适用于hash merge lookups。与数据中的密钥'foo'
关联的值是数组,而不是哈希值,因此哈希合并不适用于它们。如果您尝试对它们进行哈希合并查找(即$result = hiera_hash('foo')
),那么Hiera应该抛出错误。
如果你改为执行array merge lookup(即$result = hiera_array('foo')
),那么你的淘汰赛前缀是无关紧要的。在这种情况下,hiera从每个层次结构级别(这些都应该是数组或字符串)形成指定键的值的数组,展平它,并删除重复项。在你的数据上,结果应该是一个六元素数组['a', 'b', 'c', '--b', 'y', 'z']
。
当然还有普通的优先级查找,您可以从自动数据绑定或显式调用hiera('foo')
获得。假设“上层”意味着具有更高优先级的那个,那个查找的结果将是['a', 'b', 'c']
。