Как возвратиться, значение по умолчанию хешируют ключи hiera_hash () вызов?

В попытке очистить данные Hiera моего клиента для Марионетки и решительно сократить количество Hiera звонит в Марионеточные декларации, я изменяю конструкции как

some_name::key1: a_value_1
some_name::key2: a_value_2
[...]
some_name::keyX: a_value_X

в

some_name:
  key1: a_value_1
  key2: a_value_2
  [...]
  keyX: a_value_X

Так, чтобы вместо того, чтобы иметь X hiera() вызовы, у меня есть только один hiera_hash() звонить. Это работает отлично, пока Вы не сталкиваетесь с такой ситуацией:

# some_manifest.pp

hiera(some_name::key1, default_value_1)
hiera(some_name::key2, default_value_2)
[...]
hiera(some_name::keyX, default_value_X)

Проблема здесь состоит в том, что я не могу найти способ обеспечить значения по умолчанию для всех ключей в чистом и кратком пути. hiera_hash(key_to_be_searched, default_hash) возвращает значение default_hash если key_to_be_searched не найден в, он - иерархия. Но Вы не можете заставить его проверить, содержит ли хеш (найденный в иерархии) (по крайней мере) все ключи, определенные в default_hash.

Например, если у меня есть этот бит hiera данных:

test:
  foo: bar
  bar: baz

Вместе с этим битом DSL:

$test_default = {
  foo => '1',
  bar => '2',
  baz => 'foo',
}
$test = hiera_hash(test, $test_default)

Я ожидал бы (или скорее хотел бы), $test содержать:

  foo => 'bar',
  bar => 'baz',
  baz => 'foo',

Но, насколько я могу сказать, это не возможность. Какие Марионеточные возвраты в этом примере это:

  foo => 'bar',
  bar => 'baz',

Есть ли кто-либо здесь, у кого есть решение этой проблемы? В текущей среде я оцениваю количество вызовов Hiera в Марионетке, выполненной, чтобы быть уменьшенным где угодно между пять - и в десять раз путем реструктуризации данных в способе, которым я хочу. Это также делает для пути более чистый код.

0
задан 16 February 2015 в 14:18
1 ответ

Вам понадобится функция хэша merge из модуля stdlib .

merge : объединяет два или более хэша вместе и возвращает результирующий хэш.

Пример:

 $ hash1 = {'one' => 1, 'two' => 2}
 $ hash2 = {'two' => 'dos', 'three' => 'tres'}
 $ merged_hash = слияние ($ hash1, $ hash2)
 # Результирующий хеш эквивалентен:
 # $ merged_hash = {'one' => 1, 'two' => 'dos', 'three' => 'tres'}
 

Когда есть повторяющийся ключ, ключ в крайнем правом хэше «побеждает».

Так что в вашем случае

$test = merge( $test_default, hiera_hash(test, {}) )

Примечание 1

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

Примечание 2

Плоский список ключей обычно легче обрабатывать, и это также единственный способ использовать автоматический поиск параметров класса . Придерживаться стандартной схемы данных - это безопасная практика.

Да, это может повлиять на производительность.

2
ответ дан 4 December 2019 в 13:52

Теги

Похожие вопросы