Como tornar uma variável em uma classe Puppet parametrizada com o valor de outro parâmetro?

5

Eu tenho uma classe Puppet que configura vários serviços e arquivos de configuração. Na maioria dos casos, existe um servidor padrão que pode ser usado, mas também é possível configurar o serviço explícito por servidores. Eu me vejo fazendo isso o tempo todo:

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...
}

À medida que o número de serviços possíveis aumenta, essa sintaxe se torna desajeitado. Existe um jeito melhor de fazer isso? eu realmente quero algo ao longo das linhas de:

$server_for_thing1 = $server_for_thing1 || $default_server

... mas as variáveis não podem ser realocadas no Puppet. Há melhor maneiras de fazer isso?

    
por larsks 25.05.2012 / 22:11

2 respostas

2

Embora não seja exatamente o que você está pedindo, você já pensou em usar um Classificador de nós externos para definir e substituir o valor padrão para servidores específicos? Eu acredito que o ECN é o "caminho fantoche" de fazer as coisas em uma situação como a sua.

EDIT: (baseado no primeiro comentário)

Segunda ideia: você pode usar uma função personalizada para, pelo menos, tornar a lógica repetida de várias linhas um pouco mais legível. Algo como isso, que retorna o primeiro argumento "definido", embora com o fantoche, eu nunca tenha certeza do que "definido" é (neste caso, "undef" é passado como uma string vazia para a função, que ainda é boa o suficiente) .

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

Você pode ligar quantas vezes quiser:

$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)
    
por 26.05.2012 / 04:35
0

Desde que postei essa pergunta, há muitos anos, o módulo stdlib da Puppet aprendeu sobre a escolha function, que retornará o primeiro valor não- undef ou não-vazio de uma lista de valores. Então pode-se escrever:

$real_server_for_thing1 = pick($server_for_thing1, $default_server)

Existe também uma função pick_default que os valores vazios são válidos (você só quer ignorar undef ).

    
por 10.09.2017 / 17:47

Tags