Puppet

Es un sistema que permite la administración centralizada de un gran numero de máquinas basada en una estructura cliente-servidor. Es una herramienta open source escrita en Ruby, diseñada para funcionar en la mayoría de los sistemas operativos UNIX.

En puppet los servidores centrales, llamados puppetmasters, son instalados y configurados. La configuración es definida en el puppetmaster, compilada y luego es empujada a los clientes puppets cuando éstos se conectan.

El término cliente refiere al servicio del cliente puppet (ó puppetd), el cual se conecta al puppetmaster y se trae la configuración; mientras que el término nodo hace referencia al host sobre el cual las configuraciones son aplicadas.

Las sesiones de puppet son encriptadas y autenticadas mediante el uso de certificados autofirmados. Cada cliente puppet, nodo, genera un certificado autofirmado, que es validado y autorizado por el puppetmaster. Luego, cada cliente se conecta al puppetmaster para confirmar que su configuración se encuentra al día, si la misma ha cambiado, se recompilará y se aplicarán los cambios al cliente puppet.

Los resultados de todas las actividades son logueadas y transmitidas al puppetserver, y podrán ser visualizadas con coquetos colores.

Puppet es una combinación de: un lenguaje declarativo, mediante el uso de ruby; y la abstracción de la capa de recursos, pues puppet detecta la plataforma del nodo y funciona con la gran mayoría de los Unix.

Requerimientos en el servidor

* Los desarrolladores de puppet recomiendan un cpu con 2GB de ram para la administración de 50 a 100 nodos.

Comunicación inicial cliente-servidor (certificados)

1. Para la comunicación entre servidor puppet y cliente puppet es necesario tener habilitado y disponible el puerto 8140.
2. El servidor puppet se denominará simplemente PUPPET. El nodo puppet será MINMEI.

Configuración del servidor

1. Instalación de paquetes en el servidor puppet:

puppet:~# apt-get install puppetmaster -t testing

El finalizar el paso anterior el servidor puppet, denominado puppetmaster en debian, intentará levantar. El cual fallará debido a que no hay ningún manifiesto instalado, don't worry es inofensivo, necesitamos seguir configurando.

2. Habilitar el "servidor de archivos" (ubicado en /etc/puppet/files) propio de puppet:

puppet:~# vi /etc/puppet/fileserver.conf

[files]
path /etc/puppet/files
allow *.intranet


Creación de un manifiesto o receta (ubicado en /etc/puppet/manifests).

puppet:/etc/puppet/manifests# vi site.pp

########################
# Test inicial site.pp #
########################
class test_class {
file { "/tmp/testfile":
ensure => present,
mode => 644,
owner => root,
group => root,
}
}

node minmei {
I include test_class
}


El manifiesto anterior le dirá a puppet que genere en el nodo minmei un archivo de configuración vacío con los permisos antes definidos. El manifiesto por default debe llamarse site.pp, si existiesen otros manifiestos los mismos deben ser llamados desde site.pp a través de la claúsula import.

4. Lanzar el servicio en modo foreground y debug, de modo de tener la salida por consola.

puppet:~# puppetmasterd --debug --no-daemonize

Nota: puede lanzarse el servicio al modo clásico de debian "/etc/init.d/puppetmaster start" , es opcional. El primer modo es útil para informarnos debido a que puppet no genera logs muy descriptivos en "/var/log/puppet".

Configuración del cliente

1. Instalación de paquetes en el cliente puppet en minmei.

minmei:~# apt-get install puppet -t testing

Una vez que el paquete ha sido instalado es necesario configurar en el cliente puppet el nombre del servidor puppet. Por defecto intentará resolver el hostname puppet y conectarse al mismo.

2. En caso de que el servidor puppet no se llame puppet, es necesario explicitarlo manualmente así:

minmei:~# vi /etc/puppet/puppet.conf

[puppetd]
server = nombre_del_servidor.intranet
logdir = /var/log/puppet
vardir = /var/lib/puppet
rundir = /var/run

Nota: si el hostname del servidor puede resolverse como puppet NO ES NECESARIO llevar adelante éste paso.
3. Testear la conectividad del cliente puppet , puppetd, con el servidor puppet. Para ello lanzar el servicio así:

minmei:~# puppetd --server puppet.intranet --waitforcert 60 --no-daemonize --test

err: No certificate; running with reduced functionality.
info: Creating a new certificate request for pclient.example.con
info: Requesting certificate
warning: peer certificate won't be verified in this SSL session
notice: Did not receive certificate


De éste modo tendremos la salida por consola, lo cual es más práctico de debuggear. Igualmente es posible lanzar el servicio del cliente puppet al modo clásico de debian: "/etc/init.d/puppetd start".

Intercambio de certificados

Como mencioné al principio, puppet utiliza certificado para la comunicación en la red y el control de acceso al servidor.

La primera vez que se lanza el servicio del puppet cliente en el nodo, como se explica en el paso anterior, puppetd enviará su certificado y solicitará que el puppetmaster lo firme.

1. Del lado del servidor puppet, se debería correr el sgte comando, que listará aquellos certificados a la espera de ser firmados:

puppet:~# puppetca --list

minmei.intranet


Luego que el servidor master firma el certificado (que se encuentra a la espera del nodo minmei) el cliente puppet de minmei solicitará cada X tiempo las configuraciones definidas en el servidor puppet.

2. Firma de certificados:

puppet:~# puppetca --sign minmei.intranet

Si el certificado fué firmado, al ejecutar "puppetca --list" no debería mostrar certificados a la espera de ser firmados.

Los certificados se encuentran almacenados, tanto en el cliente como en el servidor, en /var/lib/puppet/ssl. En el servidor puppet los certificados firmados se encuentran en /var/lib/puppet/ssl/ca/signed. Si bien debian los almacena en /etc/ssl/certs, puppet no los busca allí.

Compruebo que las configuraciones fueron tomadas en el cliente

1. Compruebo si existe el archivo con sus correspondientes permisos en minmei:

minmei:# ls -l /tmp/testfile

-rw-r--r-- 1 root root 0 2008-12-16 13:00 /tmp/testfile


Casos de uso
Gestión de APT: el nodo minmei se trae del servidor puppet (a través del protocolo puppet) la configuración completa de apt y realiza una actualización del listado de paquetes una vez al día en el rango horario especificado.

puppet:~# vi /etc/puppet/manifests/site.pp

## Gestión de APT vía puppet
class apt {
file {
"/etc/apt":
ensure => directory,
owner => "root",
group => "root",
recurse => true,
source => "puppet:///files/apt";

"/etc/apt/preferences":
ensure => "/etc/apt/preferences-host"
}
schedule {
"daily":
period => daily,
range => "10-12",
repeat => 1
}
exec {
"/usr/bin/apt-get update":
schedule => daily
}
}
## Nodos que tomaran la configuración
node minmei {
include apt
}


Nota: la línea source => "puppet:///files/apt"; busca en el directorio de archivos del servidor puppet.intranet el directorio de configuración apt que se trae el cliente. Cuando el nombre del servidor puppet no es puppet la línea de source sería source => "puppet://nombre_servidor_puppet.intranet/files/apt";.

No hay comentarios.: