В попытке очистить данные 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 в Марионетке, выполненной, чтобы быть уменьшенным где угодно между пять - и в десять раз путем реструктуризации данных в способе, которым я хочу. Это также делает для пути более чистый код.
Вам понадобится функция хэша 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, {}) )
Вы должны использовать hiera_hash
только в том случае, если вам нужно глубокое слияние хэшей из нескольких уровней иерархии. Я полагаю, что с вашим подходом вы этого действительно хотите.
Плоский список ключей обычно легче обрабатывать, и это также единственный способ использовать автоматический поиск параметров класса . Придерживаться стандартной схемы данных - это безопасная практика.
Да, это может повлиять на производительность.