Usar Stages en Puppet para garantizar las actualizaciones de paquetes mediante APT | Algo de Linux

jueves, 5 de septiembre de 2013

Usar Stages en Puppet para garantizar las actualizaciones de paquetes mediante APT

Uno de los problemas que tenemos con Puppet es que, en ocasiones, realizamos un módulo que instala un software y cuando se ejecuta dicho módulo, falla la ejecución porque los índices de los repositorios no se encuentran actualizados.

Una forma de solucionar este problema es haciendo uso de un recurso que nos proporciona Puppet: Las stages o etapas.

Este recurso nos permite ordenar "la ejecución" de los recursos en etapas. Por defecto, tan sólo hay una etapa definida en Puppet llamada "main", de forma que todos los recursos son automáticamente asociados a ella, a menos que asignemos especificamente un recurso a otra etapa definida por nosotros.

Las etapas definidas por el usuario se declaran como cualquier otro recurso.

Vamos a ver a continuación cómo usar el recurso stage para garantizar que se realice siempre un apt-get update antes de que se ejecute cualquier otro recurso:

Lo ideal es que definamos nuestras stages en el archivo /etc/puppet/manifests/site.pp, salvo que no tengamos control sobre él, en cuyo caso, podemos definirlo en otra clase de orden inferior. Como éste es nuestro caso, las he definido en las clases de servidores ltsp, workstations y  portátiles:
  • /etc/puppet/manifests/classes/clase-especifica-squeeze.pp
  • /etc/puppet/manifests/classes/especifica-workstation.pp
  • /etc/puppet/manifests/classes/especifica-miniportatil-2011.pp


Primero.- Definimos las etapas que queramos crear y les damos el nombre que queramos. Como se puede ver en el siguiente ejemplo, yo he creado dos etapas: first y last.

stage { [first, last]: }

Segundo.- Especificamos cuál debe ser el orden de ejecución de las etapas. Por ejemplo:

Stage[first] -> Stage[main] -> Stage[last]

Con ésto, logramos:
  • Que la etapa "first" se ejecute antes que la etapa "main". 
  • Y la etapa "last" se ejecute después que la etapa "main".

Tercero.- Asociamos módulos o clases a etapas. Como se puede ver a continuación, estoy definiendo que el módulo "apt-get-update" debe ejecutarse en la etapa "first".

class { apt-get-update: stage => first }

Y listo.Con ésto, garantizaremos que el apt-get update se ejecute siempre antes que cualquier otro módulo que por defecto estará asociado a la etapa "main".

Como se puede ver, he definido tres etapas. De momento, no uso la etapa "last". Tan sólo la he creado por si la necesito posteriormente.