Puppet - поиск с глубоким слиянием default_value с возвращенным хешем - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь глубоко объединить поиск 'default_value' или 'default_values_hash' с хешем, возвращенным из поиска. Он не будет объединяться, и значение default_value вступит в силу, только если заголовок hiera не найден вообще. Здесь я не могу установить значения по умолчанию для ресурса, так как возвращаемые значения обрабатываются позже и еще не являются фактическими ключами ресурса.

Я пробовал многочисленные варианты, включая 'default_value', 'default_values_hash'. Я ищу способ просто установить хеш по умолчанию в манифесте и сделать так, чтобы он сливался с hiera для создания большего хеша.

Manifest:

class test (
Hash     $result = lookup('test::my_hash', {merge => 'deep', default_values_hash => {foo => 'bar', this => 'that', him => 'her'}}),
){

notice($result)

}

include test

Hiera:

---
test::my_hash:
foo:  'nobar'
this: 'then'

желаемый результат (глубокое слияние):

{foo => 'nobar', это => 'then', ему => 'her'}

фактический результат (возвращает только хеш hiera):

{foo => 'nobar', this => 'then'}

UPDATE:

Я понял, работает с кодом ниже. По-прежнему интересно, если у кого-нибудь есть лучшее решение.

class test (

$stuff = {
foo  => 'bar',
this => 'that',
him  => 'her'
},
Hash     $result = deep_merge($stuff, lookup('test::my_hash')),

){

notice($result)

}

1 Ответ

2 голосов
/ 10 июля 2019

К сожалению, так работает lookup. Значение по умолчанию используется, только если другое значение не найдено. Документация по умолчанию в lookup говорит

Если присутствует, lookup возвращает это, когда не может найти нормальное значение. Значения по умолчанию никогда не объединяются с найденными значениями.

Ваша версия с использованием функции deep_merge из stdlib представляется наилучшим решением.

class foo {
  $default_foo_attribute = {
    foo  => 'bar',
    this => 'that',
    him  => 'her',
  }

  $attribute = deep_merge($default_foo_attribute,
                          lookup('foo::attribute',
                                 Hash[String, String],
                                 'deep',
                                 {})
  notice($attribute)
}
...