在puppet hiera层次结构中使用knockout_前缀
我想使用在puppet hiera层次结构中使用knockout_前缀,puppet,hiera,Puppet,Hiera,我想使用deep\u mergeoption knockout\u前缀从puppet中的hiera数组中删除条目 # upper hierarchy --- foo: - a - b - c # lower hierarchy --- foo: - '--b' - y - z # expected result foo => [a,c,y,z] 我正在使用当前的puppet 4.x安装。根据is的Hiera层次结构配置 我的系统
deep\u merge
option knockout\u前缀从puppet中的hiera数组中删除条目
# upper hierarchy
---
foo:
- a
- b
- c
# lower hierarchy
---
foo:
- '--b'
- y
- z
# expected result
foo => [a,c,y,z]
我正在使用当前的puppet 4.x安装。根据is的Hiera层次结构配置
我的系统应正确配置以使用此功能:
$ 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合并行为适用于。数据中与key
'foo'
关联的值是数组,而不是散列,因此散列合并不适用于它们。如果您尝试对它们进行哈希合并查找(即,$result=hiera\u hash('foo')
),则hiera应该抛出一个错误
如果您改为执行(即,$result=hiera_数组('foo')
),则您的淘汰前缀是不相关的。在本例中,hiera从每个层次结构级别(预期为数组或字符串)形成指定键的值的数组,将其展平,并删除重复项。在您的数据上,这样做的结果应该是一个六元素数组,['a','b','c','-b','y','z']
当然还有普通的优先级查找,可以通过自动数据绑定或显式调用
hiera('foo')
获得。假设“上层层次”是指优先级更高的层次,那么查找的结果将是['a','b','c']
我知道我会在几年后出现,傀儡版本会晚一些,但我最近脑子里想尝试一下,在其他地方找不到解决方案。请注意,它不是淘汰的直接等价物:它是列表的傀儡运行时操作,并且不遵循条目的层次顺序。也就是说,如果您在加权最低的hiera条目中“剔除”一个值,它仍将在链的更上一层被“剔除”
下面是我的puppet类中的代码,假设问题中的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
- 数组是唯一的合并的
- 重申项目可以从层次结构的任何级别删除
$foo => ['a','b','c','--b','y','z']
$_foo_filtered => ['a','c','y','z']