Puppet (Primera parte: Instalación)

Uno de los proyectos encargados en mi nuevo empleo consiste en la administración y mantenimiento de clústers para simulaciones de ingeniería, cada uno de los componentes del clúster mantiene comunicación con un servidor que aloja las licencias de los paquetes utilizados, así como los detalles de las cuentas de usuarios. Por supuesto que administrar a todos los equipos individualmente es una tarea exhaustiva y propensa a errores, independientemente de los instrumentos de decidamos utilizar o crear, así que como primer paso me encargaron buscar una herramienta que permitiera mantener a los servidores sin necesidad de realizar la misma tarea repetitivamente, por ejemplo: tener que modificar la dirección IP del servidor de autenticación en PAM o instalar un nuevo paquete en todos los equipos.

Para mi fortuna existe Puppet, un software que debería ser la punta de lanza de los administradores y arquitectos de servidores. Éste nos permite manejar varios equipos desde un nodo central mediante definiciones de módulos en archivos de configuración, que pueden ser paquetes, archivos, servicios, etc, independientemente de la distribución. Obviamente, homogenizar la distribución a utilizar es preferible para mantener las mismas versiones y evitar errores en implementaciones de las ramas.

En esta serie vamos a utilizar Puppet para configurar Dnsmasq actuando como servidor DNS y DHCP detrás de diferentes redes, como un ejercicio para adentrarnos en el uso de esta herramienta, utilizando Debian tanto para el cliente como el servidor.

En esta primera parte instalaremos y configuraremos clientes y servidor.

Antes de comenzar debemos verificar que nuestras definiciones del host y dominio sean correctas en todos los equipos, sino tendremos muchos problemas al entablar el diálogo servidor-cliente.

Revisamos el archivo /etc/hosts donde incluiremos el FQDN para 127.0.1.1

127.0.0.1	localhost
127.0.1.1	miservidor.dominio.com	miservidor
10.1.0.200 cliente0.dominio.com
...

Debido a que en este ejercicio no tenemos servidor DNS incluiremos también las direcciones IP de nuestros nodos tanto en el servidor como en el cliente, así, en nuestro cliente el mismo archivo contiene

127.0.0.1	localhost
127.0.1.1 cliente0.dominio.com cliente0
10.1.0.1 miservidor.dominio.com
...

El FQDN también debe ser incluido en /etc/hostname, teniendo entonces en lugar de miservidor a miservidor.dominio.com.

Después de realizar los cambios ejecutamos

# /etc/init.d/hostname.sh

Comprobamos los resultados con

# hostname

miservidor.dominio.com

# dnsdomainname

dominio.com

Con esto podemos comenzar la instalación.

Debian incluye en su repositorio a puppetmaster y puppet, los cuáles serán instalados dependiendo del objetivo, como ya habrán deducido puppetmaster lo instalaremos sólo en el servidor y puppet sólo en los clientes.

Como método de autenticación con los clientes, puppetmaster utiliza llaves SSL, las cuáles debemos firmar para cada uno de ellos. Para el manejo de los certificados existe un script llamado puppetca con el cuál aparte de firmar las llaves podremos revocarlas o renovarlas si es necesario, tanto para cada nodo cliente como para todos juntos y no revueltos. Regularmente las llaves son generadas en el nodo cliente, pero con puppetca también podemos generar una llave y el cliente puede recogerla cuando sea necesario.

En esta primera parte no utilizaremos el demonio maestro, con el afán de que nuestro aprendizaje sea más provechoso, así que en el servidor ejecutamos:


root@miservidor# aptitude install puppetmaster

root@miservidor# puppetmasterd --no-daemonize -vd

Donde -v es para desplegar todos los mensajes generados (verbose) y -d para indicar que estamos en modo debug así que queremos más mensajes 😡

Sin problemas debemos obtener

notice: Starting Puppet master version 2.6.2

Lo siguiente es firmar las firmas los certificados para cada cliente que lo solicite, así que después de instalar puppet y verificar el FQDN en cada uno de ellos ejecutaremos


root@cliente0# aptitude install puppet

root@cliente0# puppetd --server miservidor.dominio.com -tvd -w 10

Donde –server indica el FQDN del servidor, -t para modo de pruebas, y -w para indicar que esperaremos 10 segundos para que el servidor firme nuestro certificado

Al ejecutarlo podemos observar en el servidor

notice: cliente0.dominio.com has a waiting certificate request

Ahora vamos a firmar la llave, ejecutamos

root@miserver# puppetca -l

Para listar todas las peticiones pendientes de ser firmadas donde debemos ver a la que generamos desde cliente0.dominio.com, si esto es correcto procedemos

root@miserver# puppetca --sign cliente0.dominio.com

Para aceptar la petición, donde observamos

notice: Signed certificate request for cliente0.dominio.com

Debido a que aún no hemos definido la configuración de los módulos para nuestro nodo cliente obtendremos el siguiente error.

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find default node or by name with ‘cliente0.dominio.com, cliente0.dominio, cliente0’ on node cliente0.dominio.com
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run

Y de esto trataremos en la segunda parte, donde definiremos cómo podemos instalar un paquete automáticamente, definir una plantilla para el archivo de configuración y establecer servicios que deban correr o reiniciarse con ciertas acciones.

Por ahora dejaremos nuestros clientes listos para iniciar, primero haremos posible ejecutar los scripts de inicialización para puppet en /etc/default/puppet (para el servidor y los clientes)

 

# Defaults for puppet - sourced by /etc/init.d/puppet                                                                

# Start puppet on boot?
START=yes

# Startup options
DAEMON_OPTS=""

Por último definimos en la configuración del cliente, /etc/puppet/puppet.conf, la dirección de nuestro servidor (sólo para los clientes)

 

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
server=miservidor.dominio.com

Con esto podremos empezar las definiciones