Restore an old file version with Puppet Bucket

Restore an old file version with Puppet Bucket

What happens if you deploy a wrong configuration with puppet to your servers? or if you want to try an old configuration in one of your servers?

It's not big deal if you use puppet because by default it does versioning of your modicated files, this could be used as backup if needed

The sintax to restore an old version of your file is

puppet filebucket restore -b /bucketdirectory /path/file MD5

By default on RHEL/CentOS/Fedora systems bucket directory is /var/lib/puppet/clientbucket

MD5 is the md5sum of your old file version, this hash we could find it on puppet logs

Example:

puppet filebucket restore -b /var/lib/puppet/clientbucket/ /etc/passwd 379aa0669894ff4150ec2dad28622216

A practical example:
Let's suppose we have a file /root/file-test.txt

[root@nodo ~]# cat /root/file-test.txt.txt
This is a rollback test

After execute puppet agent, it modifies our file:

[root@nodo ~]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for nodo.infratic.com
Info: Applying configuration version ‘1416421872’
Notice: /Stage[main]/Basico/File[/root/file-test.txt]/content:
— /root/archivo-test.txt 2014-11-19 15:40:49.248857861 -0300
+++ /tmp/puppet-file20141119-7388-tkwcex-0 2014-11-19 15:41:04.858857840 -0300
@@ -1 +1 @@
-This is a rollback test
+This should not be here
 
Info: Computing checksum on file /root/file-test.txt.txt
Info: FileBucket got a duplicate file {md5}379aa0669894ff4150ec2dad28622216
Info: /Stage[main]/Basico/File[/root/file-test.txt]: Filebucketed /root/file-test.txt to puppet with sum 379aa0669894ff4150ec2dad28622216
Notice: /Stage[main]/Basico/File[/root/file-test.txt]/content: content changed ‘{md5}379aa0669894ff4150ec2dad28622216’ to ‘{md5}3de659e5dc355b14ec5cd0606b2baef8’
Notice: Finished catalog run in 0.79 seconds

After finished execution agent notified us that it change our file content, and it shows the old md5sum and the new one:
Notice:/Stage[main]/Basico/File[/root/archivo-test.txt]/content: content changed ‘{md5}379aa0669894ff4150ec2dad28622216’ to ‘{md5}3de659e5dc355b14ec5cd0606b2baef8’

Let's check file was modified:

[root@nodo ~]# cat /root/archivo-test.txt
This should not be here

Rollback to old file version:

[root@nodo ~]# puppet filebucket restore -b /var/lib/puppet/clientbucket/ /root/file-test.txt 379aa0669894ff4150ec2dad28622216

Finally we would check if we restore our file

[root@nodo ~]# cat /root/file-test.txt.txt
This is a rollback test

Puppet Bucket is a great tool to rollback your configurations or easy recover old file versions. This could save our heads if we make a mistake in a critical configuration file

Instalacion y configuracion de Puppet 3.6 en modo MASTER/AGENT RHEL/CentOS/SL 5/6/7

Instalacion y configuracion de Puppet en modo MASTER/AGENT RHEL/CentOS/SL 5/6/7

En caso de necesitar usar Puppet en modo MASTER/AGENT es necesario tener un servidor dedicado para la tarea de "Puppet Master", basicamente es el encargado de publicar y asignar los modulos puppet para cada equipo que los solicite.

La arquitectura del modo MASTER/AGENT o MASTE/SLAVE de puppet es la siguente:

Cada equipo se conecta al Puppet MASTER a traves de un agente llamado "puppet-agent". Dicha conexion se realiza sobre HTTPS a traves del puerto 8140/tcp.

Instalacion del Puppet MASTER

Para proceder con la instalacion y configuracion del puppet master es necesario configurar los repositorios oficiales de puppetlabs.

La configuracion del repositorio varia segun la version del S.O.

  • Para RHEL/CentOS/SL 5.x
    sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-5.noarch.rpm
  • Para RHEL/CentOS/SL 6.x
    sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm     ##> En caso de ser RHEL 6
  • Para RHEL/CentOS/SL 7.x
    sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm     ##> En caso de ser RHEL 7

Instalacion de paquetes

Una vez configurado el repositorio procedemos a instalar los paquetes necesarios con el comando yum

yum install -y puppet-server

Creacion de certificado para el Master

Para crear el certificado es necesario especificar todos los nombres DNS a los que debe responder el mismo, en la mayoria de los casos dicho nombre es el FQDN de nuestro Master

Para dicha configuracion es necesario editar el archivo /etc/puppet/puppet.conf en la seccion [ main ] se debe de agregar los nombres DNS para los cuales respondera el certificado

[main]
dns_alt_names = puppet,puppet.example.com,puppetmaster01

Configuracion del servicio puppetmaster

Una vez instalados los paquetes necesarios se debe editar el archivo /etc/sysconfig/puppet

vim /etc/sysconfig/puppet

Dicho archivo debe quedar de la siguiente manera

# The puppetmaster server
#PUPPET_SERVER=puppet
 
# If you wish to specify the port to connect to do so here
PUPPET_PORT=8140
 
# Where to log to. Specify syslog to send log messages to the system log.
PUPPET_LOG=/var/log/puppet/puppet.log
 
# You may specify other parameters to the puppet client here
PUPPET_EXTRA_OPTS=--waitforcert=500

Iniciar y habilitar el servicio Puppet Master

Una vez configurado nuestro puppet master procedemos a iniciar el servicio y luego habilitar el mismo

Iniciar el servicio

service puppetmaster start

Habilitar el inicio automatico del servicio

chkconfig puppetmaster on

Creacion de modulos

Para crear los modulos es necesaria la siguiente estructura de directorio, cambiando el "modulo" por el nombre que tendra el modulo a crear

mkdir -p /etc/puppet/modules/"modulo"
 
mkdir -p /etc/puppet/modules/"modulo"/files
 
mkdir -p /etc/puppet/modules/"modulo"/manifests

Asignar modulos a clientes

Para asignar los modulos a los clientes es necesario modificar el archivo /etc/puppet/manifests/site.pp:

vim /etc/puppet/manifests/site.pp

Agregando los siguiente por cada cliente

hostnamedelcliente{
  include nombredelmodulo1
  include nombredelmodulo2
}

Instalacion y configuracion del puppet-agent en los equipos Clientes/Slave/Agentes

Una vez que se configuro el master se pasa a configurar los clientes donde correra el puppet-agent

Instalacion del puppet-agent

Para instalar el puppet-agent tambien es necesario configurar los repositorios oficiales de puppetlabs. Se puede realizar dicha tarea siguiendo los pasos descriptos para la instalacion del puppet-master

Luego se procede a instalar el paquete con el comando yum

yum install -y puppet

Configuracion del agente

Una vez que se instalo el paquete se debe modificar el archivo /etc/puppet/puppet.conf en la seccion [ agent ] agregar lo siguiente:

vim /etc/puppet/puppet.conf

server = puppet.example.com   ## (Esto se debe cambiar por el nombre DNS del servidor puppetmaster)
report = true
pluginsync = true

Iniciar y habilitar el servicio puppet-agent

Se debe tener cuenta que el cliente debe poder llegar al Master al puerto 8140/tcp

Inicio del puppet-agent

service puppet start

Habilitamos el servicio para que se levante cada vez que el equipo inicia

chkconfig puppet on

Firmar los certificados del cliente para que pueda establecer conexion con el Master

Una vez que se inicio el servicio en el cliente deberia de haber creado un certificado el mismo es enviado al puppet master, para que el cliente pueda consultar al Master es necesario firmar dicho certificado.

Dento del puppet-master ejecutamos podemos consultar la lista de certificados pendientes de firma

puppet cert list

Los certificados tienen como nombre el FQDN del cliente.
Finalmente se procede a firmar el certificado del cliente

puppet cert sign nombredelcertificado

Volver atras archivo modificado por Puppet con Puppet Filebucket

En caso de haber cometido un error en algún template o archivo modificado por puppet es posible volver atrás gracias a que por defecto puppet hace un backup de los archivos antes de modificarlos, para restaurar un backup la sintaxis del comando a ejecutar en el equipo cliente es la siguiente:

puppet filebucket restore -b /directoriobucket /ruta/archivo MD5arestaurar

Por defecto en entornos RHEL/CentOS el directorio es /var/lib/puppet/clientbucket/

Ej:

En la maquina cliente:

puppet filebucket restore -b /var/lib/puppet/clientbucket/ /etc/passwd 379aa0669894ff4150ec2dad28622216

Un Ejemplo practico:

Tenemos un archivo de texto llamado archivo-test

[root@nodo ~]# cat /root/archivo-test.txt
Esto es una prueba de rollback

Luego al ejecutar el agente puppet, el mismo modifica dicho archivo

[root@nodo ~]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for nodo.infratic.com
Info: Applying configuration version ‘1416421872’
Notice: /Stage[main]/Basico/File[/root/archivo-test.txt]/content:
— /root/archivo-test.txt 2014-11-19 15:40:49.248857861 -0300
+++ /tmp/puppet-file20141119-7388-tkwcex-0 2014-11-19 15:41:04.858857840 -0300
@@ -1 +1 @@
-Esto es una prueba de rollback
+Esto es una prueba de rollback “Esto no deberia estar despues”
 
Info: Computing checksum on file /root/archivo-test.txt
Info: FileBucket got a duplicate file {md5}379aa0669894ff4150ec2dad28622216
Info: /Stage[main]/Basico/File[/root/archivo-test.txt]: Filebucketed /root/archivo-test.txt to puppet with sum 379aa0669894ff4150ec2dad28622216
Notice: /Stage[main]/Basico/File[/root/archivo-test.txt]/content: content changed ‘{md5}379aa0669894ff4150ec2dad28622216’ to ‘{md5}3de659e5dc355b14ec5cd0606b2baef8’
Notice: Finished catalog run in 0.79 seconds

Al finalizar la ejecucion el agente nos notifica que modifico el contenido de nuestro archivo y nos muesta el MD5sum de la version anterior y de la version actual del archivo, es el MD5sum de la version anterior (lo que esta en negritas)el que debemos guardar.

Notice:/Stage[main]/Basico/File[/root/archivo-test.txt]/content: content changed ‘{md5}379aa0669894ff4150ec2dad28622216’ to ‘{md5}3de659e5dc355b14ec5cd0606b2baef8’

Verificamos de que realmente se modifico nuestro archivo

[root@nodo ~]# cat /root/archivo-test.txt
Esto es una prueba de rollback “Esto no deberia estar despues”

Procedemos a volver a la version anterior.

[root@nodo ~]# puppet filebucket restore -b /var/lib/puppet/clientbucket/ /root/archivo-test.txt 379aa0669894ff4150ec2dad28622216

Finalmente verificamos que volvimos atras los cambios hechos por Puppet

[root@nodo ~]# cat /root/archivo-test.txt
Esto es una prueba de rollback

Dicho MD5sum de la versiones anteriores de nuestros archivos modificados los podemos sacar de los logs del agente puppet en las maquinas clientes o en caso de tener herramientas como Foreman simplemente verificamos los reportes de la maquina cliente