Использование Knockout_prefix в иерархии puppet hiera

Я хочу использовать параметр deep_merge knockout_prefix для удаления записей из массива hiera в puppet.

# upper hierarchy
---
  foo:
    - a
    - b
    - c

# lower hierarchy
---
  foo:
    - '--b'
    - y
    - z

# expected result
foo => [a,c,y,z]

Я использую текущую версию puppet 4.x Установка ПК1. Конфигурация иерархии 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)
[...]

В чем здесь моя ошибка?


person ITL    schedule 09.03.2016    source источник
comment
Вы забыли указать наблюдаемый результат и показать код Puppet (или команду CLI), который выполняет поиск.   -  person John Bollinger    schedule 01.09.2018


Ответы (3)


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' }
person balder    schedule 31.08.2018

Поведение слияния Hiera 3 применяется к поискам слияния хешей. Значения, связанные с ключом 'foo' в ваших данных, представляют собой массивы, а не хэши, поэтому слияние хэшей к ним не применяется. Если вы попытаетесь найти их слиянием хэшей (т. е. $result = hiera_hash('foo')), то Hiera выдаст ошибку.

Если вместо этого выполнить поиск слияния в массиве ( т. е. $result = hiera_array('foo')), то ваш нокаутирующий префикс не имеет значения. В этом случае hiera формирует массив значений указанного ключа с каждого уровня иерархии (ожидается, что это будут массивы или строки), сглаживает его и удаляет дубликаты. В ваших данных результатом этого должен быть массив из шести элементов, ['a', 'b', 'c', '--b', 'y', 'z'].

И, конечно же, есть обычный поиск по приоритету, который вы получаете от автоматической привязки данных или от явного вызова метода hiera('foo'). Предположим, что «верхняя иерархия» означает иерархию с более высоким приоритетом, результатом такого поиска будет ['a', 'b', 'c'].

person John Bollinger    schedule 31.08.2018

Я знаю, что я приду через пару лет и опоздаю с кукольными версиями, но недавно мне пришло в голову попробовать именно это, и я не смог найти решение в другом месте. Обратите внимание, что это не прямой эквивалент нокаута: это манипулирование списком во время выполнения марионетки, и он не подчиняется иерархическому порядку записей. То есть, если вы выбиваете значение на входе иерархии с наименьшим весом, оно все равно будет выбито выше по цепочке.

Вот код в моем классе марионеток, предполагающий 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 объединен
  • Повторяем, что элемент может быть удален с любого уровня иерархии.
person bto    schedule 11.06.2021