У меня есть класс Puppet, который настраивает ряд служб и файлов конфигурации. В большинстве случаев можно использовать сервер по умолчанию, но также можно настроить явные серверы для каждой службы. Я постоянно делаю это:
class myclass (
$default_server = 'server.example.com',
$server_for_thing1 = undef,
$server_for_thing2 = undef,
$server_for_thing3 = undef
) {
if $server_for_thing1 {
$real_server_for_thing1 = $server_for_thing1
} else {
$real_server_for_thing1 = $default_server
}
# ...and so forth...
}
По мере роста количества возможных сервисов этот синтаксис становится громоздким. Есть ли лучший способ сделать это? Я действительно хочу что-то вроде:
$server_for_thing1 = $server_for_thing1 || $default_server
... но переменные нельзя переназначить в Puppet. Есть ли лучшие способы сделать это?
Хотя это не совсем то, о чем вы просите, рассматривали ли вы возможность использования Классификатор внешних узлов установить и изменить значение по умолчанию для определенных серверов? Я считаю, что ECN - это «марионеточный способ» действовать в ситуации, подобной вашей.
РЕДАКТИРОВАТЬ: (на основе первого комментария)
Вторая идея: вы можете использовать настраиваемую функцию, чтобы, по крайней мере, сделать многострочную повторяющуюся логику более читаемой. Что-то вроде этого, который возвращает первый «определенный» аргумент, хотя с марионеткой я никогда не уверен, что такое «определенный» (в этом случае «undef» передается в функцию как пустая строка, что все еще достаточно хорошо) .
module Puppet::Parser::Functions
newfunction(:get_default, :type => :rvalue) do |args|
value = nil
args.each { |x|
if ! x.nil? and x.length > 0
value = x
break
end
}
return value
end
end
Затем вы можете вызывать его столько раз, сколько хотите:
$real_server_for_thing1 = get_default($server_for_thing1, $default_server)
$real_server_for_thing2 = get_default($server_for_thing2, $default_server)
$real_server_for_thing3 = get_default($server_for_thing3, $default_server)
Поскольку я опубликовал этот вопрос много лет назад, Puppet's stdlib
модуль узнал о выбирать функция, которая вернет первую не-undef
или непустое значение из списка значений. Итак, можно написать:
$real_server_for_thing1 = pick($server_for_thing1, $default_server)
Также есть pick_default
пустые значения функции допустимы (вы хотите только игнорировать undef
).