Administración centralizada de equipos mediante PUPPET | Algo de Linux

miércoles, 10 de junio de 2009

Administración centralizada de equipos mediante PUPPET

PUPPET es una herramienta que facilita el trabajo de un administrador de sistemas permitiéndole hacer instalaciones, actualizaciones, cambios de configuraciones, etc... en equipos remotos. Lo que evita tener que desplazar un técnico para realizar dichas modificaciones.

Puppet se compone de varios elementos:
  • Un servidor -> puppetmaster.
  • Un servicio para los clientes -> puppetd.
  • Un lenguaje declarativo para definir lo que se quiere hacer en los clientes.
  • Un sistema para obtener datos de los clientes -> facter.
Un detalle importante para entender puppet es tener en cuenta que el servidor define, mediante el lenguaje declarativo de puppet, los estados que se desea tener en los clientes. Y no es necesario definir las instrucciones que hay que ejecutar para lograr esos estados.

Por ejemplo: Supongamos que queremos que en nuestros clientes debe estar instalado el paquete sshfs. Para garantizar que esté instalado tan sólo tendremos que escribir una regla como la siguiente en el servidor:

package { "sshfs":
ensure => installed
}

Y puppet se encargará de que se instale si el paquete no está instalado aún, sin tener que preocuparnos de hacer ningún procedimiento para instalarlo.

Además hay un principio fundamental en puppet: el principio de idempotencia. No importa el número de veces que se ejecute una regla. El efecto debe ser como si sólo se hubiera ejecutado una vez. Además, puppet se encargará de no ejecutar una regla si el objetivo final se ha conseguido.

Comunicación entre el cliente y el servidor puppet.
La comunicación entre el cliente y el servidor es cifrada mediante SSL.
Para garantizar que esta comunicación sea cifrada, el servidor puppet tiene una pequeña autoridad certificada que maneja certificados X509.

Instalación de puppet.
Para instalar puppet, tendremos que hacer varias cosas:
  • Instalar un servidor puppet.
  • Configurar el servidor puppet.
  • Instalar el cliente puppet en todas las máquinas que queramos administrar.
  • Configurar el cliente puppet.
Instalar un servidor puppet.
Instalar un servidor puppet es tan sencillo como instalar el paquete puppetmaster:

# apt-get install puppetmaster

Se resolverán todas las dependencias y se instalarán todos los paquetes necesarios.

Configurar el servidor puppet.

Primer paso.- Configurar el servidor de ficheros.

Para poder servir ficheros a los clientes puppet, lo primero que tenemos que hacer es modificar el fichero /etc/puppet/fileserver.conf. En este fichero especificaremos a qué rango de máquinas de la red queremos servirles ficheros. Ésto se hace en la sección [files] de dicho fichero. Por ejemplo, si mi red es la 192.168.1.0 y quiero servir ficheros de puppet a todas las máquinas de esta red, añadiré una línea allow:

[files]
path /etc/puppet/files
allow 192.168.1.0/24

En este fichero también se puede usar deny para denegar el acceso a ciertas máquinas. Y da igual el orden que coloquemos el allow y el deny. El allow prevalece sobre el deny.
Además, tanto en el allow como en el deny, se puede especificar tanto un rango de red como un nombre de dominio. Ejemplo: allow *.valledeljerte3

Segundo paso.- Modificar el el fichero /etc/puppet/puppet.conf
Por defecto, este fichero contiene la localización de los directorios de logs, de datos, de certificados ssl, etc. Como los valores por defecto nos sirven para hacer una configuración básica, tan sólo le añadimos las dos líneas que he resaltado en negrita:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
pluginsync=true

[puppetmasterd]
templatedir=/var/lib/puppet/templates
certname=puppetdptos
autosign=false

En la primera línea añadida (certname=puppetdptos) estamos indicando que el servidor de certificación se llama puppetdptos (es el nombre de la máquina en la que hemos instalado puppetmaster).

En la segunda (autosign=false) estamos indicando al servidor que no debe firmar las peticiones de certificados que le lleguen de forma automática. Si quisiéramos que el servidor firmase todas las peticiones de certificados que le llegasen, pondríamos autosign=true. La opción por defecto es autosign=false, con lo que no sería necesario especificar esta opción. La pongo más que nada por si en algún momento quiero que el servidor firme de forma automática los certificados.

Tercer paso.- Crear el esqueleto manifests.
Si no estuviera creado el directorio de clases y/o el directorio manifests, lo creamos:

# mkdir -p /etc/puppet/manifests/classes

Cuarto
paso.- Crear el fichero site.pp
Este es un fichero de control fundamental del servidor puppet. Podríamos crearlo con:

# touch /etc/puppet/manifests/site.pp

Supongamos que en el directorio /etc/puppet/manifests/classes/ hemos creado un fichero llamado test_class.pp con el siguiente contenido:

class test_class {
file {"/tmp/fichero.test":
ensure => present,
mode => 744,
owner => root,
group => root
}
}

En este archivo hemos definido la clase test_class, que contiene una definición del tipo file que se puede leer de la siguiente forma: Debe existir el archivo /tmp/fichero.test con permisos 744 y debe pertenecer al usuario root y al grupo root.

Existen otros tipos de definición que podemos utilizar y que son particularmente útiles. Por ejemplo:

  • package, para el manejo de de software.
  • exec, para ejecutar comandos en el sistema del cliente.
  • cron, para programar tareas en el sistema del cliente.
  • Existen muchos más tipos de definiciones. Podemos verlas en el Type Reference de Puppet.
Podemos añadir un contenido básico al fichero site.pp, y utilizar en él la clase test_class creada en anteriormente:

# Importamos todas las clases del directorio classes
import "classes/*.pp"

# En node default incluimos las tareas para todos los nodos
node default {
include test_class
}

# Definimos un nodo de pruebas
node "a25-pro" inherits default {
# include clase_a_probar
}

Crearemos las tareas en el directorio /etc/puppet/manifests/classes y las llamaremos con include en el nodo de pruebas. Las ejecutaremos. Y si todo va bien, pasaremos la tarea al nodo default para que se ejecute en todos los clientes.

Una vez terminada la configuración del servidor puppet, si no está iniciado, lo iniciamos:

# /etc/init.d/puppetmaster start

No es necesario reiniciarlo después de hacer cambios en los ficheros de configuración. El servidor está monitoreando los archivos de configuración y los reelerá a los pocos segundos de ser modificados.

Instalar un cliente puppet.
Instalar un cliente puppet es tan sencillo como instalar el paquete puppet:

# apt-get install puppet

Se resolverán todas las dependencias y se instalarán todos los paquetes necesarios.

Configurar el cliente puppet.
Configurar el cliente puppet es más sencillo aún. Lo único que tendremos que hacer es editar el fichero /etc/puppet/puppet.conf y añadir una línea server=servidorpuppet.
En la línea server=XXXXXXXXXXXXX podemos indicar:
  • La dirección ip del servidor puppet.
  • O el nombre de dicho servidor, si tenemos un servidor de dns en la red.
El contenido básico del fichero /etc/puppet/puppet.conf en el cliente podría ser el siguiente:

[main]
server=puppetdptos
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
# pluginsync=true

Funcionamiento de puppet y comprobaciones.
No olvidemos que para que el sistema funcione, deben estar iniciados puppetmaster en el servidor y puppet en el cliente. Si no lo están, los iniciamos:

# /etc/init.d/puppetmaster start (en el servidor)

# /etc/init.d/puppet start (en el cliente)

Si hubiera algún problema en el funcionamiento, lo mejor es echar un vistazo a los logs, que se encuentran almacenados en /var/log/puppet

El tiempo predeterminado de contacto del cliente con el servidor es de 30 minutos, cosa que podemos cambiar (Se define en segundos).

Para probar si una tarea se ejecuta correctamente en un cliente, paramos puppet y ejecutamos puppetd -t:

# /etc/init.d/puppet stop

# puppetd -t

Una vez comprobado que las tareas se han ejecutado, volvemos a iniciar el servicio:

# /etc/init.d/puppet start

No es necesario reiniciar puppet ni puppetmaster después de hacer cambios en los ficheros de configuración. El servidor está monitoreando los archivos de configuración y los reelerá a los pocos segundos de ser modificados.

Gestión de certificados en el servidor.
Cuando un cliente intenta comunicarse con el puppetmaster, el servidor se encargará de comprobar si sus certificados son válidos.

Si tenemos configurado nuestro servidor con autosign=false (opción por defecto), podemos comprobar si hay peticiones de certificados pendientes de firmar, ejecutando:

# puppetca --list

Por otra parte, si al ejecutar el comando anterior, vemos que la máquina a24-pro.valledeljerte3 ha hecho una petición y su certificado no ha sido firmado aún, podemos firmárselo con:

# puppetca --sign a24-pro.valledeljerte3

Si quisiéramos revocar el certificado concedido a esta máquina, haríamos lo siguiente:

# puppetca --revoke a24-pro.valledeljerte3

Y si quisiéramos limpiar los ficheros relacionados con la petición de certificación de un host para que se vuelva a hacer una petición de certificado:

# puppetca --clean a24-pro.valledeljerte3

1 comentario:

EL TERAPIAS dijo...

excelente su aporte, bien completo y bastante digerible para cualquier tipo de usuario. espero continué con esta loable labor de enseñar sus conocimientos. y ojala muchos entendieran que el conocimiento mientras se comparte puede crecer mas rápidamente que solo guardándolo de manera individual.