Доступ к нескольким вложенным значениям hiera из кода марионетки (или команды "поиск марионетки")

Это, вероятно, очень простой вопрос, но, кажется, трудно найти ответ в Интернете, или, по крайней мере, я трачу слишком много времени на это.

Как я могу получить доступ или напрямую составить список из всех foo::bar значения из hieradata файл (ниже) в модуле Puppet с lookup() или лучше?

---
foo::bar:
    'some uniq name':
        baz: 12345
        ...

    'another uniq name':
        baz: 54321
        ...

Так что, если будет возможно использовать подстановочные знаки, путь ключа будет выглядеть следующим образом -> foo::bar::*::baz.

1 ответ

Решение

Это требует использования lookup функция, лямбда-итератор и синтаксическая запись хэша, так что на самом деле это не так просто, хотя код может показаться таким.

Нам нужно перебрать значения для ключей внутри foo::bar хэш. Мы можем начать с этого через:

lookup(foo::bar, Hash).each |String $key, Hash $value| {
  # first $key is 'some uniq name' string
  # first $value is 'some uniq name' hash
}

Теперь нам нужно получить доступ к значениям для bar ключ внутри каждого вложенного хэша. Мы можем сделать это с помощью обычного синтаксиса для доступа к значениям ключей внутри хеша:

lookup(foo::bar, Hash).each |String $key, Hash $value| {
  $value['baz'] # first value is 12345
}

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

$bazes = lookup(foo::bar, Hash).map |String $key, Hash $value| {
  $value['baz']
}

Таким образом, достигается цель сохранения массива (или списка, как вы это выразили) всех baz значения внутри hieradata. Хотя код короткий, возможно, не все так просто.

Полезная документация -

поиск: https://puppet.com/docs/puppet/5.2/hiera_use_function.html
лямбда-итератор map: https://puppet.com/docs/puppet/5.3/function.html
Доступ к значениям хеша: https://puppet.com/docs/puppet/5.3/lang_data_hash.html

Другие вопросы по тегам