我想使用deep_merge
选项 knockout_prefix 从木偶中的hiera数组中删除条目。
# upper hierarchy
---
foo:
- a
- b
- c
# lower hierarchy
---
foo:
- '--b'
- y
- z
# expected result
foo => [a,c,y,z]
我正在使用当前的puppet 4.x PC1安装。根据{{3}}的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)
[...]
我的错误是什么?
答案 0 :(得分:1)
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' }
答案 1 :(得分:0)
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']
。
答案 2 :(得分:0)
我知道我会在几年后推出木偶版本,但我最近想尝试一下这个,但在其他地方找不到解决方案。请注意,它不是直接等同于淘汰赛:它是列表的傀儡运行时操作,并且不遵守条目的层次结构顺序。也就是说,如果您在权重最低的 hiera 条目中“淘汰”一个值,它仍将在链的更上游被“淘汰”。
这是我的木偶类中的代码,假设问题中的 $all.plugins | gm -MemberType Properties | select -expandproperty Name | %{ $all.plugins.$_.url}
hiera:
foo
对于示例 hiera,这将导致
# Make an array of all of the items that start with `--`
# (i.e., those that will be knocked out)
$_foo_knockout = $foo.filter |$item| { $item =~ /^--/ }
# Make a new array of items that:
# * don't directly match an item in the knockout list
# * don't match an item in the knockout list when prefixed with `--`
$_foo_filtered = $foo.filter |$item| {
!($item in $_foo_knockout or "--${ex}" in $_foo_knockout)
}
注意事项:
$foo => ['a','b','c','--b','y','z']
$_foo_filtered => ['a','c','y','z']
和 hiera = 3.5.0
进行测试puppet = 6.7.2
合并