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?
$bar::file_name
y$::file_owner
acceder 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.Respuestas:
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_owner
lugar de tener que proporcionar el mismo valor (por ejemplolarry
) en varios lugares diferentes.Su fragmento de ejemplo (con dos nodos adicionales) podría escribirse de la siguiente manera:
Con su uso de variables globales, necesitaría declarar una variable nombrada
$owner
en cada nodo y no podría sobrescribir la$file_name
variable / parámetro por nodo. En su lugar, deberá declarar otrabar
clase 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:
fuente
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.
fuente