2012-06-01 14 views
5

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 

~

+0

¿Por qué su clase de servidor web necesita depender de su clase mysql? ¿Cuál es la dependencia real allí? –

+0

@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". –

Respuesta

5

Si Clase [mysql] es opcional, a continuación, puede intentar comprobar si existe con la función definida():

if defined(Class['mysq'l]) { 
    Class['mysql'] -> Class['webserver'] 
} 

He aquí algunos ejemplos de código que solía probar esto:

class optional { 
    notify{'Applied optional':} 
} 

class afterwards { 
    notify{'Applied afterwards':} 
} 

class another_optional { 
    notify{'Applied test2':} 
} 

class testbed { 

    if defined(Class['optional']) { 
      notify{'You should see both notifications':} 
      Class['optional'] -> Class['afterwards'] 
    } 


    if defined(Class['another_optional']) { 
      notify{'You should not see this':} 
      Class['another_optional'] -> Class['afterwards'] 
    } 
} 

node default { 
    include optional 
    include afterwards 
    include testbed 
} 

Después de ejecutar con un 'títere aplica test.pp', que genera esta salida:

notice: You should see both notifications 
notice: /Stage[main]/Testbed/Notify[You should see both notifications]/message: defined 'message' as 'You should see both notifications' 
notice: Applied optional 
notice: /Stage[main]/Optional/Notify[Applied optional]/message: defined 'message' as 'Applied optional' 
notice: Applied afterwards 
notice: /Stage[main]/Afterwards/Notify[Applied afterwards]/message: defined 'message' as 'Applied afterwards' 
notice: Finished catalog run in 0.06 seconds 

He probado con la marioneta 2.7 .1 en Ubuntu 11.10

+0

Esto parece muy prometedor. Permítanme probar este enfoque con etapas: si se define una clase, estableceré su etapa ... ¡Creo que esto funcionaría muy bien! Aceptaré la solución una vez que me prueben. –

Cuestiones relacionadas