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

12

Geralmente, ao trabalhar com módulos fantoche complexos, configurarei 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 classes parametrizadas ajudam quando esta situação? Como você está usando classes parametrizadas para estruturar seus módulos de fantoches?

    
por robbyt 26.02.2011 / 23:38

2 respostas

12

Classes parametrizadas são uma construção de linguagem para ajudar você a estruturar melhor seu código. Isso evita que você use excessivamente variáveis globais (como no seu exemplo).

Imagine que você incluiu mais 20 classes na descrição do seu nó e todas precisariam de algumas variáveis sendo definidas no escopo global ou de nó do manifesto. Também classes parametrizadas permitem que você tenha parâmetros padrão facilmente, então você pode usar um valor padrão para o $file_owner em vez de ter que fornecer o mesmo valor (por exemplo, larry ) em vários locais diferentes.

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

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ê precisaria declarar uma variável chamada $owner em cada nó e não seria possível substituir o parâmetro $file_name variable / por nó. Em vez disso, você precisaria declarar outra classe bar para cada nó.

O documento sobre a evolução da linguagem Puppet e, claro, o guia de idiomas fornecem alguns bons exemplos sobre como usar classes parametrizadas e a lógica por trás dessa construção de linguagem:

por 27.02.2011 / 16:04
8
A melhor maneira de pensar sobre isso é vir desde o início, em vez de começar com os idiomas Puppet.

O que você está tentando fazer em primeiro lugar é passar parâmetros para uma classe - você está dando informações necessárias para decidir como se comportar, assim como passar argumentos para um função. Digamos que isso era perl e você tinha uma função chamada multiply_squares. Você chamaria isso de multiply_squares(3, 4) , não definiria algumas variáveis globais para 3 e 4 e depois 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 do idioma ser projetado para isso. Pessoalmente, acho que uma vez que as classes parametrizadas se tornam um pouco mais evoluídas e mais amplamente implementadas, elas basicamente fazem das 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 hacks assustadores.

    
por 27.02.2011 / 20:28

Tags