Configuraciones

Despliega manifiestos Puppet en remoto

Luches de coche bajo puente

El objetivo de los scripts en Bash del repositorio que enlaza este artículo es actualizar de manera remota un servidor Puppet 4 con los últimos cambios realizados en la rama master de un repositorio Git. Los scripts se distribuyen en un módulo de Puppet. Las variables de los scripts deberán ser modificadas por el operador para adaptarlas a las necesidades de su entorno.

El operador lanza un script en una máquina que disponga el último commit del repositorio. El script hace un push, muestra en pantalla los cambios que realizará en el Puppet server, simula la aplicación de la receta, realiza los cambios en el server, los aplica y envía un reporte por email. El guión se ejecuta en modo interactivo con el operador, puede realizarse sólo la simulación y ver la salida en pantalla sin realizar ningún cambio efectivo. Si los cambios son los deseados, puede aplicarse el commit de manera efetiva. En caso contrario, se sale del script. También es posible aplicar los cambios sin simulación.

Asumo que el repositorio se clona en el directorio /usr/manifests/ y que la distribución es Debian.

Uno de los scripts reemplaza todo el directorio de manifiestos en producción que está usando Puppet por los archivos del commit. Por esa razón, es muy importante ejecutar previamente la simulación. Ésta se hará con los archivos en /usr/manifests y no sobre los de producción. En caso de craso error, será necesario volver al último commit que funcionó y copiar los manifiestos a producción.

El repositorio está aquí.

Son requisitos tener instalados awk, swak, colordiff y sudo en el master. Además, un usuario creado que pueda ejecutar con permisos de root. En caso de crear un usuario específico para esta tarea,  será necesario darle todos los permisos para un único script. Suponiendo que el usuario se llame puppetdeploy:

puppetdeploy ALL=(ALL:ALL) NOPASSWD:/usr/local/bin/puppet-deploy

Este usuario será el encargado de ejecutar el script llamado puppet-deploy

Este post es conceptuales así que suponemos también que estos archivos son lo único que tenemos en el repositorio de manifiestos de Puppet.

Trabajo en el servidor

En primer lugar, creamos el directorio /usr/manifests

Clonamos los archivos del git en /usr/manifests. Copiamos el archivo puppet-deply.sh a /usr/local/bin/puppet-deploy

mkdir /usr/manifests
cd /usr/manifests
git clone //github.com/gustavomrfz/puppetdeploy
cp /usr/manifests/puppet-deploy/modules/puppet/files/puppet-deploy.sh /usr/local/bin/puppet-deploy

Es necesario copiarlo manualmente en este paso, ya que el script que lanza el operador llama a este archivo.

Trabajo en maquina local

Un operador que haya clonado el repositorio en su máquina de trabajo, debe tener en el directorio raíz del repo el archivo commit-to-puppet.sh. Este script se encarga de hacer un push del último commit y, tanto si actualiza el repositorio como si no, envía por ssh la ejecución del script puppet-deploy.

El script puppet-deploy lo lanza con la línea:

ssh puppetdeploy@${PUPPET} "sudo puppet-deploy"

Si se quiere usar una llave SSH hay que añadir:

ssh -i ${SSHKEY} puppetdeploy@${PUPPET} "sudo puppet-deploy"

Puppet-deploy

Este script es el core del despliegue al servidor de Puppet. En primer lugar, hace un pull del repositorio a /usr/manifests/puppet-deploy. A continuación, muestra las diferencias de este directorio con el directorio en producción de Puppet. Cuando el operador ha comprobado que son las diferencias deseadas, puede ejecutar una simulación (–noop), que lanza esta línea:

${PUPPET} apply --noop ${SRC}/manifests/site.pp --modulepath=${SRC}/modules --debug --noop;

Tras la simulación, el script pregunta bajo advertencia si los manifiestos y módulos se copian a producción. Si el operador responde que quiere actualizar producción, el script procede eliminando los manifiestos de producción y copia los archivos del commit. A continuación, aplica los cambios en el master y envía un reporte por email a los destinatarios especificados en la variable RECEIVER.

El archivo  /usr/local/bin/puppet-deploy será sobrescrito por Puppet de ahora en adelante cada vez que se aplique su manifiesto. Es posible saltarse el paso de copiar este archivo a mano ejecutándolo en el servidor como bash /usr/manifests/puppet-deploy/modules/puppet/files/puppet-deplot.sh, que tendría el mismo efecto que ejecutar el script en remoto.

Hi, I’m Gustavo Moreno