Por que devo usar uma classe com parâmetros de fantoches?

12

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?

Robbyt
fonte
2
Observe para todos que encontrarem este exemplo, esse código mostra pesquisas de variáveis ​​globais que foram permitidas na versão Puppet <3.0. No Puppet> 3.0, você não pode acessar variáveis ​​fora do escopo e deve usar um espaço para nome para acessar variáveis. Neste exemplo, você precisaria usar $bar::file_namee $::file_owneracessar 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.
22813 Robbyt #

Respostas:

12

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_ownervez de precisar fornecer o mesmo valor (por exemplo larry) em vários locais diferentes.

Seu snippet de exemplo (com dois nós adicionais) pode ser escrito da seguinte maneira:

node 'example.com' { 
  class { bar: }
}

node 'example.net' {
  class { bar: owner = "harry" }
}

node 'example.net' {
  class { bar: file_name = "barry.txt" }
}

class bar($owner = "larry", $file_name = "larry.txt") { 
  class { do_stuff: owner => $owner, file_name => $file_name }
}

class do_stuff($owner, $file_name) {
  file { $file_name:
    ensure => file,
    owner  => $owner,
  }
}

Com o uso de variáveis ​​globais, você precisará declarar uma variável nomeada $ownerem cada nó e não poderá substituir a $file_namevariável / parâmetro por nó. Em vez disso, você precisa declarar outra barclasse 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:

joschi
fonte
8

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.

nfagerlund
fonte