Как вернуть стандартные хеш-ключи в вызове 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 будет сокращено в 5–10 раз путем реструктуризации данных так, как я хочу. Это также делает код чище.
1 ответ
Вам нужен хеш 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
Простой список ключей обычно проще обрабатывать, и это также единственный способ использовать автоматический поиск параметров класса. Это безопасная практика придерживаться стандартного макета данных.
Да, это может повлиять на производительность.