Geralmente, ao trabalhar com módulos fantoches complexos, definirei variáveis no nível do nó ou dentro de uma classe. por exemplo,
node 'foo.com' {
$file_owner = "larry"
include bar
}
class bar {
$file_name = "larry.txt"
include do_stuff
}
class do_stuff {
file { $file_name:
ensure => file,
owner => $file_owner,
}
}
Como / quando / por que as classes parametrizadas ajudam nessa situação? Como você está usando classes parametrizadas para estruturar seus módulos fantoches?
$bar::file_name
e$::file_owner
acessar essas variáveis respectivas. No entanto, ao usar classes parametrizadas, as variáveis passadas para uma classe por meio dos parâmetros tornam-se variáveis com escopo local.Respostas:
Classes parametrizadas são uma construção de linguagem para ajudá-lo a estruturar melhor seu código. Isso impede que você use excessivamente variáveis globais (como no seu exemplo).
Imagine que você incluiu mais 20 classes na descrição do nó e todas precisariam que algumas variáveis fossem definidas no escopo global ou do nó do manifesto. As classes parametrizadas também permitem que você tenha parâmetros padrão com facilidade, portanto, você pode usar um valor padrão para, em
$file_owner
vez de precisar fornecer o mesmo valor (por exemplolarry
) em vários locais diferentes.Seu snippet de exemplo (com dois nós adicionais) pode ser escrito da seguinte maneira:
Com o uso de variáveis globais, você precisará declarar uma variável nomeada
$owner
em cada nó e não poderá substituir a$file_name
variável / parâmetro por nó. Em vez disso, você precisa declarar outrabar
classe para cada nó.O documento sobre a evolução da linguagem do Puppet e, é claro, o guia da linguagem fornece alguns bons exemplos de como usar classes parametrizadas e a lógica por trás dessa construção da linguagem:
fonte
A melhor maneira de pensar sobre isso é começar desde o início, em vez de começar a conhecer os idiomas dos fantoches.
O que você está tentando fazer em primeiro lugar é passar parâmetros para uma classe - você está fornecendo as informações necessárias para decidir como se comportar, assim como passar argumentos para uma função. Digamos que isso fosse perl e você tinha uma função chamada multiply_squares. Você chamaria assim
multiply_squares(3, 4)
, não configuraria algumas variáveis globais para 3 e 4 e as leria de dentro da função!Mas, historicamente, o código Puppet teve que fazer isso com variáveis globais ou escopo dinâmico, porque a necessidade de fazê-lo surgiu antes que o idioma fosse projetado para fazê-lo. Pessoalmente, acho que uma vez que as classes parametrizadas ficam um pouco mais evoluídas e mais amplamente implementadas, elas basicamente tornarão as questões de escopo variável uma coisa do passado, porque ter a ferramenta certa disponível para o trabalho eliminará toda uma camada de hackers assustadores.
fonte