在puppet hiera层次结构中使用knockout_prefix

时间:2016-03-09 09:18:21

标签: puppet hiera

我想使用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)
[...]

我的错误是什么?

3 个答案:

答案 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 合并
  • 重申可以从层次结构的任何层级中剔除一个项目