Puppet - Pass hash как аргумент класса
4 Mike Purcell [2015-10-30 21:19:00]
Попытка сделать что-то вроде этого:
# nodes.pp
node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {
class { 'custom::core':
overrides => {
'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
}
}
}
# custom::core
class custom::core($overrides = {}) {
if (has_key($overrides, 'openssh')) {
$settings = $overrides['openssh']['settings']
# Doesn't work
create_resources('openssh', $settings)
# Doesn't work
class { 'openssh': $settings }
}
}
Можно ли вызвать класс и передать хэш в качестве аргументов?
Кукольный/Кукольный матер v2.7.26-1 (Centos 6.7)
puppet
2 ответа
2 Решение ptierno [2015-11-03 05:28:00]
Один из моих коллег придумал хорошее решение для чего-то подобного в старые 2+
дни марионетки. Используется create_resources
для этого.
http://www.followski.com/quick-note-how-to-use-create_resources-to-initialize-a-class-in-puppet/
ваш код может выглядеть примерно так:
nodes.pp
node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {
class { 'custom::core':
overrides => {
'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
}
}
}
заказ:: ядро
class custom::core($overrides = {}) {
if (has_key($overrides, 'openssh')) {
$settings = $overrides['openssh']['settings']
create_resources('class', { 'openssh' => $settings })
}
}
Вы заметите, что в приведенном выше примере он выглядит как create_resources('class', $params)
, но предполагается, что у вас есть хеш с ключом, являющимся именем класса (т.е. openssh
), и его значением являются параметры, которые нужно задать. Приведенный выше пример, по сути, делает то же самое.
Ваше определение node также может выглядеть следующим образом:
node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {
class { 'custom::core':
overrides => {
'openssh' => {'external_access' => 'true'}, # Allow direct mounting for dev
'rsyslog' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}
}
}
}
и ваш класс примерно так:
class custom::core($overrides = {}) {
if (has_key($overrides, 'openssh')) {
create_resources('class', {'openssh' => $overrides['openssh'])
}
if (has_key($overrides, 'rsyslog')) {
create_resources('class', {'rsyslog' => $overrides['rsyslog'])
}
}
Я думаю, вы догадались.
Мы использовали это довольно часто несколько лет назад. Возможно, вам стоит подумать о том, чтобы перейти к обновлению вашей марионеточной инфраструктуры.
Надеюсь, что это поможет, или, по крайней мере, указывает вам в правильном направлении.
2 Felix Frank [2015-11-01 22:03:00]