Clases y definiciones en títeres

Clases y definiciones en títeres

Aunque conozco la solución inmediata a un problema que enfrenté ayer (gracias a la gente de IRC #puppet), todavía no entiendo cómo resolvió el problema, o más bien cuál es la diferencia fundamental entre clases y definiciones en este particular. guión:

La definición original, que era incorrecta:

define srv($name,$enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){

                exec {"sleep 5": path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}

                service{"$name":

                    enable=>$enable,
                    ensure=>$ensure,
                    provider=>$provider,
                    hasstatus=>$hasstatus,
                    hasrestart=>$hasrestart,
                } 
                              }

err: No se pudo recuperar el catálogo del servidor remoto: Error 400 en el SERVIDOR: Definición duplicada: Exec[sleep 5] ya está definido en el archivo /etc/puppet/modules/common/manifests/defines/srv.pp en la línea 4; no se puede redefinir en /etc/puppet/modules/common/manifests/defines/srv.pp:4 en el nodo testing.abc.def.com

La definición correcta:

define srv($enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){

                exec {"sleep 5 for $name": command=>"sleep 5", path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}

                service{"$name":

                    enable=>$enable,
                    ensure=>$ensure,
                    provider=>$provider,
                    hasstatus=>$hasstatus,
                    hasrestart=>$hasrestart,
                }
                              }

Entonces, ¿por qué el error en el primer caso? ¿Cómo estoy duplicando una definición? En otras palabras, si hubiera un solo módulo que usara esta definición, ¿la primera definición habría funcionado? Tal vez sea la terminología de títeres en los documentos lo que me ha dejado confundido, pero después de haber escrito un montón de módulos (en funcionamiento) y no entender esto me parece peligroso, espero poder obtener algunas respuestas claras.

Respuesta1

Los recursos en Puppet deben ser únicos, es decir, deben tener un nombre único.

En el caso descrito, tenías el recurso Exec["sleep 5"]en tu definición y cada vez que llamas srv(es básicamente lo mismo que incluir una clase parametrizada), el recurso Exec["sleep 5"]también se incluirá y así el analizador encontrará dos o más recursos con el mismo nombre.

Al agregar la $namedefinición al nombre de su Execrecurso, lo hace único. Bueno, al menosmás probableúnico ya que cuando tenga otro recurso con el mismo nombre ( Exec["sleep 5 for foo") en algún otro lugar de sus manifiestos, volverá a encontrarse con este error.

información relacionada