Creación de módulos en Puppet

En esta entrada vemos diferentes ejemplos de módulos en Puppet. Ya sabéis que esta herramienta es genial para la gestión de configuración en entornos de IT. Para los más novicios, con Puppet podemos hacer que todos los servidores de un entorno dado tengan los mismos ficheros de configuración; evitando así que terceros, de manera maliciosa o por descuido, puedan desestabilizar una plataforma.

Podemos crear diferentes tipos de módulos sencillos, tanto asegurarnos que SELinux esté deshabilitado en todos los hosts, que los ficheros de zona horaria sean los correctos o que los DNS sean los indicados. A modo de ejemplo vemos este último.

Clases en Puppet

Antes de continuar, hay que recordar que hemos tratado Puppet en varios artículos en la web:

Para desarrollador y probar las clases, he utilizado este entorno:

  • Servidor central con Centos 7 con el nombre «servpuppetmaster«
  • Servidor cliente 1 con sistema operativo Centos 7, con el nombre «servclient1«

De esta manera jugamos con un servidor central y un cliente. En los artículos que he indicado antes os explico la instalación y primera configuración, por lo que esa parte la obviaré.

Clase DNS en Puppet

Para poder crear un nuevo módulo, vamos a utilizar la herramienta «puppet module generate«, de la siguiente manera:

  1. puppet module generate davidochobits-dns --skip-interview

De esta manera se crean todos los ficheros y carpetas necesarias, como plantilla, para poder crear nuestro primer módulo.

  1. Notice: Generating module at /tmp/dns...
  2. Notice: Populating templates...
  3. Finished; module generated in dns.
  4. dns/Gemfile
  5. dns/Rakefile
  6. dns/examples
  7. dns/examples/init.pp
  8. dns/manifests
  9. dns/manifests/init.pp
  10. dns/spec
  11. dns/spec/classes
  12. dns/spec/classes/init_spec.rb
  13. dns/spec/spec_helper.rb
  14. dns/README.md
  15. dns/metadata.json

En el fichero «dns/manifests/init.pp», adjuntamos esta configuración:

  1. class dns{
  2.         file{'/etc/resolv.conf':
  3.                 content => template('clase-dns/resolv.erb'),
  4.                 owner   => root,
  5.                 group   => root,
  6.         }
  7. }

Indicamos el fichero que queremos controlar, además de decir que plantilla que vamos a utilizar.

La plantilla la tenemos ubicada en «dns/templates/resolv.erb«, por lo que tenemos que crear la carpeta y el fichero, que contendrá:

## Fichero controlado por puppet ##
nameserver 8.8.8.8
nameserver 8.8.4.4

En el ejemplo he utilizado los DNS de Google. Debemos adoptar la configuración a nuestras necesidades.

Además es esencial que adaptemos el fichero en formato JSON a nuestras necesidades:

  1. {
  2.   "name": "davidochobits-dns",
  3.   "version": "0.1.0",
  4.   "author": "davidochobits",
  5.   "summary": null,
  6.   "license": "Apache-2.0",
  7.   "source": "",
  8.   "project_page": null,
  9.   "issues_url": null,
  10.   "dependencies": null,
  11.   "data_provider": null
  12. }

Una vez hecho esto, nos ubicamos dentro de la carpeta y ya podemos construir el fichero del módulo:

  1. [root@servpuppetmaster dns]#  puppet module build 
  2. Notice: Building /tmp/dns for release
  3. Module built: /tmp/dns/pkg/davidochobits-dns-0.1.0.tar.gz

Ahora ya lo podemos instalar:

  1. [root@servpuppetmaster dns]# puppet module install /tmp/dns/pkg/davidochobits-dns-0.1.0.tar.gz
  2. Notice: Preparing to install into /etc/puppetlabs/code/environments/production/modules ...
  3. Notice: Downloading from https://forgeapi.puppet.com ...
  4. Notice: Installing -- do not interrupt ...
  5. /etc/puppetlabs/code/environments/production/modules
  6. └── davidochobits-dns (v0.1.0)

Para probar el módulo en el cliente, lo debemos añadir a su fichero de configuración:

  1. vi /etc/puppetlabs/code/environments/production/manifests

Y añadir el contenido:

  1. node 'servclient1' {
  2.   include dns
  3. }

De esta forma ya podemos ejecutar el agente en el cliente:

  1. sudo /opt/puppetlabs/bin/puppet agent --test

Con el resultado:

Despliegue del nuevo módulo en el cliente


Y ya podemos ver el fichero controlado por puppet:

[davidochobits@servclient1 ~]$ cat /etc/resolv.conf 
## Fichero controlado por puppet ##
nameserver 8.8.8.8
nameserver 8.8.4.4

Con este tipos de módulos, podemos tener controlados los ficheros de configuración principales del sistema operativo y evitar así que los «manazas» los cambian a su gusto.

En entornos productivos, con un gran parque informático que gestionar, hacerlo a mano no es ni mucho menos lo más óptimo. Para ello podemos utilizar plataformas como Foreman, que permite gestior los módulos de puppet, los entornos, las clases, de forma sencilla.

Fuentes consultadas

Systemadmin.es – Ejemplo de módulo de puppet
Puppet.com – Node definitions