miércoles, 30 de julio de 2014

Chef: Desplegando nuestro primer cookbook


En el tutorial de hoy vamos a mostrar de forma práctica los pasos necesarios para utilizar la arquitectura cliente-servidor de Chef. Necesitaremos:
  • Un servidor de Chef.
  • Un repositorio local donde almacenar y editar nuestras configuraciones.
  • Una máquina donde instalaremos el cliente de Chef.

Hosted Chef

Vamos a utilizar Hosted Chef, un servicio proporcionado por Opscode, que nos ofrece un Servidor de Chef y una completa interfaz web para su gestión. Con esto evitaremos instalar un Servidor de Chef desde cero.
Para empezar, creamos una cuenta de usuario nueva en la página de Hosted Chef (click en Get Chef). Llegará un correo electrónico con un enlace que debemos abrir para validar la cuenta.
Una vez registrados, entramos en el panel de gestión de Hosted Chef y creamos una organización nueva. Hay que rellenar el nombre e identificador de la organización y escoger un plan. Seleccionamos el plan gratuíto, que ofrece hasta un máximo de 5 nodos gestionados por Chef.

En la siguiente pantalla, tras crear la organización, debemos descargar dos ficheros.

  • [tu-organización]-validator.pem es una clave que nos servirá para registrar en esta organización nuevos clientes de Chef, es decir, los servidores a configurar.
  • knife.rb contiene la configuración necesaria para usar knife, la herramienta de línea de comandos de Chef.
Accedemos al panel de cambio de contraseña de nuestra cuenta de Hosted Chef y, en la sección Reset User Key, hacemos click en Get a new key. Se descargará un fichero que contiene la clave privada que sirve para identificar a nuestro usuario en el servidor de Chef.

Con esto, ya disponemos de los tres ficheros necesarios para configurar el repositorio de Chef.

Puesta a punto del repositorio

Clonamos el repositorio oficial de Chef en un directorio de nuestra máquina local.
$ git clone git://github.com/opscode/chef-repo
Creamos un directorio con nombre .chef dentro de chef-repo y movemos ahí los ficheros que hemos descargado antes. El contenido debería quedar así:
$ ls .chef/
[tu-organización]-validator.pem
[tu-nombre-de-usuario].pem
knife.rb
Nos situamos en el directorio chef-repo y, con la ayuda de knife, comprobamos que nuestras credenciales están bien.
$ knife client list
[tu-organización]-validator
Nota: Si no tienes knife en tu sistema, debes instalar el paquete Omnibus de Chef.

Crear un cookbook

En el anterior post explicamos lo que era una receta, un fichero escrito en Ruby que contiene una configuración para aplicar en la máquina. Hoy introducimos el concepto de cookbook, que no es más que una colección de recetas relacionadas entre sí. Por ejemplo, un cookbook de MySQL podría contener dos recetas: una que instala el servidor y otra que instala el cliente.
El Servidor de Chef no almacena recetas sueltas, así que vamos a ver cómo adaptar la receta del último día a un cookbook.
Creamos un cookbook de nombre clock usando knife.
$ knife cookbook create clock
** Creating cookbook clock
** Creating README for cookbook: clock
** Creating CHANGELOG for cookbook: clock
** Creating metadata for cookbook: clock
En un editor de texto abrimos la receta por defecto del cookbook (está en cookbooks/clock/recipes/default.rb) y copiamos el siguiente código.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Nos aseguramos de que el paquete de ntpdate este instalado
case node['platform']
when 'redhat','centos','scientific','fedora','suse','amazon' then
  package 'ntp'
when 'debian', 'ubuntu' then
  package 'ntpdate'
else
  log('Unsupported platform, trying to guess ntpdate package') { level :warn }
  package 'ntp'
end

# Anyadimos una entrada cron al sistema
cron 'System Clock Synch' do
  user 'root'
  minute '45'
  command '/usr/sbin/ntpdate -u hora.roa.es > /dev/null 2>&1'
end

Subir el cookbook al Servidor de Chef

El cookbook que acabamos de crear está en nuestra máquina local, pero para poder aplicarlo en los nodos es necesario subirlo al servidor de Chef.
$ knife cookbook upload clock
Uploading clock          [0.1.0]
Uploaded 1 cookbook.
Este mismo comando sirve también para subir al servidor actualizaciones que hagamos en nuestro cookbook.

Arranque del nodo

Para probar el cookbook necesitamos una máquina donde tengamos acceso SSH y permiso para ejecutar comandos como root con sudo. Ejecutamos:
$ knife bootstrap HOSTNAME \
  --ssh-user USER \
  --run-list "recipe[clock]" \
  --sudo
El proceso puede tardar unos minutos. La salida del comando terminará con:
localhost Chef Client finished, 1 resources updated
Este comando instala el cliente de Chef en la máquina y ejecuta el cookbook indicado en run_list. Si no devuelve ningún error significa que el estado del nodo es equivalente al especificado en la configuración. Esto es lo que se conoce como convergencia en Chef.
Comprobamos que el nodo aparece entre los gestionados por el servidor:
$ knife node list
[nombre-del-nodo]
También podemos loguearnos por SSH en la máquina y comprobar que el paquete ntpdate está instalado y la entrada del crontab añadida.

Borrar el nodo

Desde el momento en el que se ha realizado el bootstrap del nodo, éste ha quedado registrado en el servidor de Chef. Esto sirve para que el cliente pueda recibir actualizaciones del cookbook desde el servidor. Para derregistrarlo podemos hacerlo desde el listado de nodos del panel de gestión, o desde la línea de comandos utilizando knife:
$ knife node delete NOMBRE_DEL_NODO
$ knife client delete NOMBRE_DEL_NODO

Conclusiones

En este tutorial hemos visto la forma de configurar una máquina con Chef. Podemos intuir la potencia que se esconde tras esta herramienta sabiendo que es posible gestionar de esta manera cientos o miles de nodos.
También hemos aprendido varios comandos básicos de la herramienta knife, que va a demostrar ser una gran aliada mientras nos sumergimos en el universo de Chef.
En próximos post profundizaremos en la creación de cookbooks y veremos cómo podemos usar cookbooks creados por la comunidad de Chef.

No hay comentarios:

Publicar un comentario