在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
  • 数组是唯一的合并的
  • 重申项目可以从层次结构的任何级别删除

您忘记了说明观察到的结果是什么,忘记了显示执行查找的Puppet代码(或CLI命令)。
$foo => ['a','b','c','--b','y','z']
$_foo_filtered => ['a','c','y','z']