Как отфильтровать хэш в манифесте кукол?

Не могли бы вы мне помочь. Я получаю dict от hiera в манифесте марионеток, а затем пытаюсь отфильтровать их и передать скрипт python в качестве аргументов. Но не знаю, как это сделать.

Моя иера:

myclass::server_conf:
 'first_serv':
   'serv_name': 'testname'
   'serv_hostname': 'testhost'
   'test_url': '[email protected]'
 'second_serv':
   'serv_name': 'testname2'
   'serv_hostname': 'testhost2'
   'test_url': '[email protected]'

Мой манифест кукол (я получаю хеш от значений в hiera):

 $server_conf = hiera_hash('myclass::server_conf', {})

В результате этого у меня было:

{\"first_serv\"=>{\"serv_name\"=>\"testname\", \"serv_hostname\"=>\"testhost\", \"test_url\"=>\"[email protected]\"}, \"second_serv\"=>{\"serv_name\"=>\"serv2\", \"serv_name\"=>\"testname2\", \"serv_hostname\"=>\"testhost2\", \"test_url\"=>\"[email protected]\"}}

Затем я хочу выбрать из этого списка только значения:

'testname' 'testhost' '[email protected]' 'testname2' 'testhost2' '[email protected]'

Я пытаюсь сделать это с помощью функции карты:

$transforrmed_data = map(server_conf) |$key,$value| { $value }

И получаю ошибку:

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not match |$key,$value| at /manifests/server.pp:26 on node test.node

Как я могу решить эту проблему? Также мне нужно передать еще одну переменную 'testname2' 'testhost2' '[email protected]' и передать ее ресурсу команды exec.

Спасибо!


person BigBoss    schedule 24.01.2016    source источник


Ответы (1)


Похоже, на форуме Ask PuppetLabs есть довольно хороший пример: Перебрать вложенный хэш из hiera в манифест.

Решение использует определенный тип, который запускает ваш файл exec. Затем просто автоматически переберите свой хэш с помощью create_resources(), который преобразует hash в набор ресурсов и добавляет их в каталог. Эта функция упрощает создание множества ресурсов из источника данных Hiera одновременно, вместо того чтобы писать собственную циклическую функцию. Его лучше всего использовать с определенными типами, поскольку они могут быть реализованы много раз.

Я адаптировал их пример для ваших целей:

define run_my_exec($serv_name, $serv_hostname, $test_url) {
  notify { "$serv_name": }
}

$server_conf = hiera_hash('myclass::server_conf', {})
create_resources( run_my_exec, $server_conf )

Кроме того, использование exec в марионетке — это запах кода. Не то чтобы это всегда плохо, но часто это наименее элегантный способ решения проблемы. Например, этот exec настраивает ваш сервер? Если это так, возможно, будет лучше использовать шаблон для записи файла конфигурации. Вот еще один взгляд на execs из кукольных документов для этого типа:

Предупреждение: широко распространена тенденция использовать коллекции exec для управления ресурсами, которые не покрываются существующим типом ресурсов. Это хорошо работает для простых задач, но как только ваша стопка исполняемых файлов становится достаточно сложной, чтобы вам действительно приходилось думать, чтобы понять, что происходит, вам следует подумать о разработке собственного типа ресурсов, так как он будет гораздо более предсказуемым и удобным в сопровождении.

person Dan Bowling    schedule 24.01.2016
comment
Мне нужно использовать команду exec для запуска скрипта Python (который создает некоторые конфигурации на сервере с помощью API): python python.py $serv_name $serv_hostname $test_url . Смогу ли я запустить его для first_serv и second_serv, запустив create_resources? - person BigBoss; 25.01.2016
comment
да. Я отредактирую свой ответ, чтобы он был более понятным, но функция create_resource() выполняет итерацию по хэшу и создает новый экземпляр ресурса с ключами/значениями внутри этого хэша. Итак, пример кода, который я вам дал, будет запускать notify() и выводить testname и testname2. - person Dan Bowling; 25.01.2016
comment
В этом случае у меня ошибка: Ошибка: Не удалось получить каталог с удаленного сервера: Ошибка 400 на СЕРВЕРЕ: Повторяющееся объявление: Exec[server_config] уже объявлен в файле /etc/puppet/modules/server/master.pp:355; нельзя повторно объявить в /etc/puppet/modules/server/master.pp:355 на узле - person BigBoss; 26.01.2016
comment
Это потому, что имя exec должно быть уникальным при каждом запуске. Используйте $name внутри его имени, это должно получить ключ для хэша, по которому он повторяется. - person Dan Bowling; 26.01.2016
comment
Я не совсем понимаю насчет Use $name внутри своего имени, что вы имеете в виду под этим? - person BigBoss; 26.01.2016
comment
Я добавил 2 ключа $name в 'first_serv' и 'second_serv' и поместил ключ $name вместо exec name? это правильно? Спасибо! - person BigBoss; 26.01.2016
comment
Когда вы создаете ресурс (например, exec, файл, пользователь, пакет и т. д.), его имя (или заголовок) должно быть уникальным. Например, package{My Package Title: sure =› present}. Этот заголовок должен быть уникальным, он никогда не может быть объявлен во второй раз. Трудно объяснить это в поле для комментариев без форматирования, не могли бы вы задать еще один вопрос о SO и просто оставить комментарий со ссылкой на это? Я отвечу на это более полным объяснением. Так будет лучше и для сообщества, так как это действительно отдельная тема. - person Dan Bowling; 26.01.2016