Estoy tratando de resolver el siguiente problema con Puppet:Orden de ejecución de títeres para las clases opcionales
Tengo varios nodos. Cada nodo incluye una colección de clases. Por ejemplo, hay una clase mysql
y una clase webserver
. node1 es solo un servidor web, node2 es webserver + mysql.
Quiero especificar que si un nodo tiene tanto servidor web como mysql, la instalación de mysql ocurrirá antes del servidor web.
No puedo tener Class[mysql] -> Class[webserver]
dependencia, porque el soporte de MySQL es opcional.
Traté de usar etapas, pero parecen introducir dependencias entre mis clases, por lo que si tengo, p. esto:
Stage[db] -> Stage[web]
class {
'webserver':
stage => web ;
'mysql':
stage => db ;
}
e incluyo la clase servidor web en mi nodo
node node1 {
include webserver
}
.. la clase MySQL se incluyó también! Eso no es lo que quiero.
¿Cómo puedo definir el orden en clases opcionales?
Editar: aquí está la solución:
class one {
notify{'one':}
}
class two {
notify{'two':}
}
stage { 'pre': }
Stage['pre'] -> Stage['main']
class {
one: stage=>pre;
# two: stage=>main; #### BROKEN - will introduce dependency even if two is not included!
}
# Solution - put the class in the stage only if it is defined
if defined(Class['two']) {
class {
two: stage=>main;
}
}
node default {
include one
}
Resultado:
notice: one
notice: /Stage[pre]/One/Notify[one]/message: defined 'message' as 'one'
notice: Finished catalog run in 0.04 seconds
~
¿Por qué su clase de servidor web necesita depender de su clase mysql? ¿Cuál es la dependencia real allí? –
@CodeGnome Estaba intentando que sea muy simple de explicar. Tengo etapas más o menos equivalentes a "máquina desnuda" - "todas las redes funcionando" - "todas las fuentes de datos disponibles" - "varias herramientas de apoyo de títeres instaladas" - "ahora podemos hacer el trabajo real". –