Назад | Перейти на главную страницу

Как сделать переменную в параметризованном классе Puppet по умолчанию равным значению другого параметра?

У меня есть класс 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).