2012-03-01 19 views
5

Tengo este node.pp y me pregunto cómo lo va a ejecutar el títere.Flujo de ejecución de marionetas

node 'agent.puppet.demo' { 
    include ssh 
    include postfix 
    include mysql 
    include apache 
} 

En el nodo de agente, cuando corro esto:

$ puppetd -t -d 

El títere no ejecuta secuencialmente sentido, que no se ejecuta ssh primero, después de sufijo, ...

¿Alguien sabe a que se debe esto? ¿Es porque se llama 'lenguaje declarativo' donde el orden de ejecución realmente no importa?

Si este es el caso, entonces puedo simplemente en cierta forma, declarar lo que quiero y Puppet averiguará cómo ejecutarlo?

Respuesta

17

Descargo de responsabilidad: soy uno de los desarrolladores de Puppet.

Lo ejecutará en un orden consistente pero impredecible, con la excepción de cualquier dependencia explícita o implícita en el código. Las dependencias explícitas son cosas que usted especifica con los metaparámetros subscribe o require. Las dependencias implícitas provienen de la función autorequire , que hace cosas como aplicar automáticamente recursos de archivos en un orden razonable.

La razón de esto no es tanto que el lenguaje sea declarativo, sino que el lenguaje es declarativo porque el orden no importa para la mayoría de las cosas en el espacio del problema subyacente.

Por ejemplo, realmente no hay mucha conexión entre la administración de ssh y la administración de postfix para la mayoría de las personas; podría hacer el trabajo en cualquier orden, o incluso al mismo tiempo, y todo funcionaría igual.

Eso nos libera para mejorar las cosas de muchas maneras en que "todo está en orden lineal" no lo hace. Estamos trabajando, por ejemplo, para realizar lotes de instalaciones de paquetes sin dejar de respetar las dependencias explícitas fuera de los paquetes.

Por lo tanto, el orden de ejecución y las dependencias sigue el problema subyacente, y hemos conservado esa propiedad para poder hacer más cosas increíbles.

El objetivo es exactamente lo que dices al final: declaras lo que deseas y nos ocupamos de todos los detalles para conseguirlo. Con el tiempo esperamos ser mucho más inteligentes sobre las dependencias lógicas, por lo que tienes que decir incluso menos para conseguir eso.

+2

¿Puedes definir qué es * orden constante pero impredecible *? Estamos teniendo muchos problemas cuando Puppet 2.6 solo reordena los pasos y debido a algunas dependencias falta, falla. Esto no se puede probar. ¿Puedo forzar algún tipo de mezcla para que podamos probarla correctamente? También escuché que la nueva versión le da un orden fijo. – lzap

+0

Entonces, por ejemplo, tengo un paquete para instalar que depende de la existencia de un repositorio en yum.repos.d. ¿Cómo puedo exigir que el repositorio esté instalado antes de intentar instalar el paquete? – Mojo

3

responsabilidad: yo soy todavía bastante nuevo en marioneta :)

La clave es pensar en todo en términos de dependencias. Para las dependencias de clase, me gusta usar la sintaxis de Clase ['a'] -> Clase ['b']. Supongamos que tiene una clase de Tomcat que requiere una clase jdk que descarga/instala el jdk solar de Oracle. En su clase de Tomcat, puede especificar esto con

Clase [ 'JDK'] -> Clase [ 'gato']

alternativa, se puede declarar una clase con un parámetro de meta requerirá en lugar de utilizar incluyen.

+0

Entonces, supongo que tengo que agregar las siguientes líneas para asegurarme de que las dependencias se apliquen correctamente. Clase ['apache'] -> Clase ['mysql'] -> Clase ['postfix'] -> Clase ['ssh'] ¿Hay otro enfoque para lograr un orden secuencial sin hacer que los módulos independientes sean interdependientes usando Requerimiento interno => Clase ... – Maverick

+0

Lo tiene al revés. Clase ['a'] -> Clase ['b'] significa que la clase b requiere Clase a. La forma en que me gusta hacerlo es, cada paquete en su propio módulo. Cada módulo especifica sus propias dependencias en otras clases. Me gusta usar una clase uber base para cosas como ssh que todo lo requiere. Para eso utilizo las etapas de ejecución para garantizar que siempre se ejecute primero. – czervik

+0

@czervik ¿te importa mostrar cómo incluyes tu clase uber en cosas como ssh para que esté incluido en todas las demás clases? – memyself

Cuestiones relacionadas