¿Por qué debería usar una clase parametrizada de marioneta?

12

Generalmente cuando trabajo con módulos de títeres complejos, estableceré variables a nivel de nodo o dentro de una clase. p.ej,

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,
  }
}

¿Cómo / cuándo / por qué las clases parametrizadas ayudan cuando esta situación? ¿Cómo estás usando clases parametrizadas para estructurar tus módulos de títeres?

robbyt
fuente
2
Nota para todos los que encuentren este ejemplo, este código muestra búsquedas de variables globales que se permitieron en Puppet versión <3.0. En Puppet> 3.0, no puede acceder a variables fuera del alcance, y debe usar el espacio de nombres para acceder a las variables. En este ejemplo, tendría que usar $bar::file_namey $::file_owneracceder a esas variables respectivas. Sin embargo, cuando se utilizan clases parametrizadas, las variables pasadas a una clase a través de los parámetros se convierten en variables de ámbito local.
robbyt

Respuestas:

12

Las clases parametrizadas son una construcción de lenguaje para ayudarlo a estructurar mejor su código. Le impide usar excesivamente variables globales (como en su ejemplo).

Imagine que incluye 20 clases más en la descripción de su nodo y todas necesitarían que se establezcan algunas variables en el ámbito global o de nodo del manifiesto. Además, las clases parametrizadas le permiten tener parámetros predeterminados fácilmente, por lo que podría usar un valor predeterminado para en $file_ownerlugar de tener que proporcionar el mismo valor (por ejemplo larry) en varios lugares diferentes.

Su fragmento de ejemplo (con dos nodos adicionales) podría escribirse de la siguiente manera:

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,
  }
}

Con su uso de variables globales, necesitaría declarar una variable nombrada $owneren cada nodo y no podría sobrescribir la $file_namevariable / parámetro por nodo. En su lugar, deberá declarar otra barclase para cada nodo.

El documento sobre la evolución del lenguaje de Puppet y, por supuesto, la guía del idioma proporcionan algunos buenos ejemplos sobre cómo usar las clases parametrizadas y los fundamentos de esta construcción del lenguaje:

joschi
fuente
8

La mejor manera de pensar en esto es hacerlo desde el principio en lugar de comenzar por conocer los modismos de Puppet.

Lo que está tratando de hacer en primer lugar es pasar parámetros a una clase: le está dando la información que necesita para decidir cómo comportarse, al igual que pasar argumentos a una función. Digamos que esto era perl y tenía una función llamada multiply_squares. ¡Lo llamaría así multiply_squares(3, 4), no establecería algunas variables globales en 3 y 4 y luego las leería desde dentro de la función!

Pero históricamente, el código de Puppet ha tenido que ver con variables globales o alcance dinámico, porque la necesidad de hacerlo surgió antes de que el lenguaje fuera diseñado para hacerlo. Personalmente, creo que una vez que las clases parametrizadas se desarrollen un poco más y se desplieguen más ampliamente, básicamente harán que los problemas de alcance variable sean cosa del pasado, porque tener la herramienta adecuada disponible para el trabajo eliminará una capa completa de ataques terroríficos.

nfagerlund
fuente