Como definir variáveis com basenode (em nodes.pp)?

2

Estou tentando o Puppet e parece ser bom.

Minha pergunta é muito fácil, mas não posso responder.

Eu tenho um arquivo "node.pp":

node basenode {
         include "dns"
#        include "ntp"
}


node 'myserver.domain.com' inherits basenode {
        $type_server = "client"
        include "ntp"
}

Eu gostaria de declarar minha variável "$ type_server" sem declarar "include ntp" em cada servidor. Eu gostaria de "basenode" inclui "ntp" e use o valor de "$ type_server" no nó do meu servidor.

A variável é usada nos manifestos do NTP.

Obrigado antecipadamente.

    
por Ricky 19.07.2011 / 18:08

3 respostas

3

Não use variáveis - como Shane disse, o escopo variável no Puppet é FUBAR, e tentar usá-lo apenas causa dor, sofrimento, náusea, dores de cabeça e, provavelmente, doença cardíaca.

Em vez disso, use tipos definidos. É para isso que eles são projetados. Assim, em vez de usar classes e includes em todos os lugares, use um tipo definido e passe os dados de que precisa:

define ntp_server($type_server) {
    # Do all the things you'd normally do, using $type_server as needed
}

node 'myserver.domain.com' {
    ntp_server { ntp:
        type_server => "client"
    }
}
    
por 19.07.2011 / 19:31
2

O escopo no fantoche é um pouco ... não intuitivo. É um comportamento de avaliação linear - como a herança acontece antes que a variável seja definida e as classes incluídas na classe herdada sejam avaliadas imediatamente, a variável é definida após você precisa dela.

Em vez de herdar, tente incluir apenas a "base" na parte inferior de cada nó, para que seja avaliada após as variáveis necessárias estarem configuradas. Não é uma maneira muito orientada a objetos para fazer as coisas, mas esse comportamento de escopo não deixa muitas opções.

node 'myserver.domain.com' {
    $type_server = "client"
    include basenode
}
    
por 19.07.2011 / 18:55
2

Eu sei que isso é muito antigo, mas como eu estava tendo alguns problemas com ele e encontrei este tópico, ele pode ser útil para outras pessoas.

Em vez de usar tipos definidos ou incluir um nó dentro de um nó - o que não parece muito interessante - sugiro usar classes com parâmetros . Usando isso, o autor poderia continuar usando suas classes normalmente, e essas classes teriam apenas uma pequena modificação para receber as variáveis (que já estão usando) como parâmetros.

Então, como exemplo, em vez de:

class foo {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

Poderia ter:

class foo($content) {
  file { 'abc':
    path => "some/path"
    content => $content
  }
}

E use assim:

node 'myserver.domain.com' {
    class { 'foo':
        $content => "something pretty smart"
    }
}
    
por 09.08.2013 / 16:38

Tags