我想使用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 安装。根据官方文档的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 合并行为适用于哈希合并查找。 与数据中的键'foo'
关联的值是数组,而不是哈希值,因此哈希合并不适用于它们。 如果您尝试对它们进行哈希合并查找(即$result = hiera_hash('foo')
),则 Hiera 应该抛出错误。
如果您改为执行数组合并查找(即 $result = hiera_array('foo')
),那么您的挖空前缀无关紧要。 在这种情况下,hiera 会从每个层次结构级别(这些应该是数组或字符串)中形成指定键的值数组,将其展平,并删除重复项。 在数据上,其结果应该是一个六元素数组,['a', 'b', 'c', '--b', 'y', 'z']
.
当然,还有普通的优先级查找,您可以从自动数据绑定或显式调用hiera('foo')
中获得。 假设"上层层次结构"是指具有更高优先级的层次结构,则该查找的结果将是['a', 'b', 'c']
。
我会在几年内来,而且木偶版本迟到了,但我最近想到了尝试这个,但在其他地方找不到解决方案。请注意,它不是直接等同于淘汰赛:它是列表的傀儡运行时操作,并且不服从条目的分层顺序。也就是说,如果您在权重最低的 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)
}
使用示例 hiera,这将导致
$foo => ['a','b','c','--b','y','z']
$_foo_filtered => ['a','c','y','z']
笔记:
- 经过
hiera = 3.5.0
和puppet = 6.7.2
测试 - 数组
unique
合并 - 重申可以从层次结构的任何级别剔除项目