Назад | Перейти на главную страницу

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

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

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

Но, насколько я могу судить, это невозможно. В этом примере Puppet возвращает следующее:

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

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

Вам нужен хеш merge функция от stdlib модуль.

merge: Объединяет два или более хеша вместе и возвращает полученный хеш.

Пример:

$hash1 = {'one' => 1, 'two' => 2}
$hash2 = {'two' => 'dos', 'three' => 'tres'}
$merged_hash = merge($hash1, $hash2)
# The resulting hash is equivalent to:
# $merged_hash =  {'one' => 1, 'two' => 'dos', 'three' => 'tres'}

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

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

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

Примечание 1

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

Заметка 2

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

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