Puppet Hiera обращается к глобальному объекту в более конкретном файле

Я изо всех сил пытаюсь понять, как hiera работает с данными, мне кажется, что простой yaml, использующий frontmatter для включения файлов глобальных данных, был бы проще и мощнее.

В любом случае, я хочу сделать что-то вроде этого:

# global.yaml
collection1: &collection1
    foo: 1
collection2: &collection2
    bar: 2
collection3: &collection3
    baz: 3

# development_environment.yaml
collection:
    <<: *collection1
    <<: *collection2

# production_environment.yaml
collection:
    <<: *collection2
    <<: *collection3

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

Как я могу это сделать? Я застрял в ручном дублировании базовых данных во всех моих различных средах?

Я понимаю, что я мог бы поместить оператор case среды в код марионетки, чтобы выбрать, какие базовые коллекции включать, но это нарушает разделение задач хранения данных в hiera и кода в марионетке. Если мне нужно это сделать, я могу вообще пропустить hiera и поместить свои данные в марионеточные модули.


person danny    schedule 23.12.2013    source источник


Ответы (1)


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

# global.yaml
collection1:
    foo: 1
collection2:
    bar: 2
collection3:
    baz: 3

# development_environment.yaml
collection:
    - collection1
    - collection2

# production_environment.yaml
collection:
    - collection2
    - collection3

Теперь вы можете написать что-то вроде этого:

# this variable will contain something like ['collection1','collection2']
$collections = hiera('collection')
# Now get all the corresponding values
$hashparts = $collections.map |$r| { $x = hiera($r); $x } # [{"baz"=>3}, {"bar"=>2}]
# Now we merge all the parts
$hash = $hashparts.reduce |$a,$b| { $x = merge($a,$b); $x } # {"baz"=>3, "bar"=>2}

Это уродливо, но должно делать то, что вы ожидаете. Сделка с $x = function(); $x здесь из-за неудачного решения, что все функции лямбда могут использоваться в любом контексте (оператор или значение), поэтому во время синтаксического анализа мы не знаем, ожидаем ли мы последнюю «токен» «блока» должен быть оператором или выражением.

person bartavelle    schedule 24.12.2013