Acessando a variável do nó na classe e usando-a em uma condição

2

Estou tentando configurar o Apache Virtual Hosts com o Puppet e tenho tentado coisas diferentes com pouco sucesso.

Eu defini um nó da seguinte forma:

node 'test1.cob' inherits serveurClient {
        $smcvhost = 'all'
}

A classe serveurClient inclui a classe apache. Isso funciona bem, pois o Apache é instalado e toda a configuração é aplicada corretamente, exceto os hosts virtuais.

A configuração relacionada aos hosts virtuais é a seguinte:

class apache::config {
    File{
        require => Class["apache::install"],
        notify  => Class["apache::service"],
        ensure  => present,
        owner   => "www-data",
        group   => "www-data",
        mode    => 755
    }
    ...
    if ( $smcvhost == 'belleville' ) or ( $smcvhost == 'all' ) {
        apache::smcvhost{'belleville':
            client => 'belleville',
        }
    }
    ...
}

A definição apache :: smcvhost funciona corretamente porque se eu especificá-lo diretamente no nó sem a condição, o host virtual é criado corretamente sem erros. Se eu remover a instrução if, ela também será criada corretamente. Eu tentei apenas especificar a segunda condição, mas isso não funcionou.

Quando isso não é executado, não recebo nenhum erro. O relatório de fantoches simplesmente ignora essa parte da configuração.

Estou pensando que isso é algum tipo de problema de escopo variável, mas pelo que li, essa prática parece correta e imagino que o boneco me daria algum erro se tentasse avaliar uma variável não existente.

    
por Antoine Benkemoun 12.08.2011 / 12:19

2 respostas

2

O Puppet não avisa você sobre variáveis não definidas (exceto em modelos, curiosamente), e, quando você define uma variável, somente o material especificado após é afetado. Então:

node 'test1.cob' inherits serveurClient {
        # Nothing above this line knows $smcvhost
        $smcvhost = 'all'
        # Stuff from this line until "}" knows $smcvhost
}
        # Stuff from this point on don't know $smcvhost

Se você observar as notas de lançamento das versões recentes do Puppet, verá que o escopo dinâmico está a caminho da aposentadoria. Meu conselho é evitar o uso de variáveis para passar informações o máximo possível - use parâmetros, como em definições ou classes com parâmetros.

    
por 12.08.2011 / 16:46
0

Em vez de:

o nó 'test1.cob' herda o serveurClient {         $ smcvhost = 'all' }

se você fizer:

nó 'test1.cob' {         $ smcvhost = 'all'         include serveurClient }

então sua variável existirá no escopo serveurClient, que é onde eu suponho que sua classe apache seja referenciada.

    
por 13.08.2012 / 15:31

Tags