在puppet hiera层次结构中使用knockout_prefix

问题描述 投票:2回答:2

我想使用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安装。根据official documentation的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)
[...]

我的错在哪里?

puppet hiera
2个回答
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' }

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']

© www.soinside.com 2019 - 2024. All rights reserved.