Crear nuestro primer Playbook en Ansible

La intención de esta entrada es seguir hablando de Ansible. Lo cierto es que a principio de año apreté el acelerador respecto a este tema, pero el motor paró en seco y he estado un buen tiempo sin hablar de él. Una parte importante de Ansible y el lugar de donde podemos sacar un buen jugo de este zumo es con los Playbook. Pero vayamos por partes.

¿Qué son lo Playbook?

Los libros de jugadas, esto es, los Playbook, son esencialmente un conjunto de instrucciones que envía para ejecutar en un solo objetivo o grupos de objetivos, véase anfitriones. Esto es similar a las instrucciones que nos podemos encontrar al adquirir un mueble (o rompecabezas), en la archifamosa tienda sueca de turno. El fabricante incluye instrucciones para que podamos juntar las piezas en el orden correcto. Cuando se sigue dicho orden, los muebles una vez montados se suelen parecer a los de las fotos de los catálogos (o no)

Pues así es esencialmente es así como funcionan.

Los módulos

El primero que vamos a construir instalará un servidor web un host con sistema operativo Centos 7. Posteriormente creará un fichero index.html basado en una plantilla, que estará ubicada en el Playbook final. La idea es que adaptéis esta configuración a vuestras necesidades. En este utilizaremos diferentes módulos que explicaremos más al detalle a posteriori.

Los autores

Cuando el autor añade las instrucciones para que los módulos se ejecuten, la mayoría de las veces se deben añadir argumentos adicionales. Cuando se ejecuta los módulos se van cargando de manera ordenada, tal y como está indicado en el fichero. El estado del host objetivo puede cambiar en función de los resultados de estos módulos.

Trabajando con los Playbook

Para poder ejecutarlos de manera eficaz debemos tener en cuenta varias cosas.

  1. El objetivo: Debido a que los Playbooks están proporcionando dirección e interactividad con los módulos, Ansible asume que sabemos cómo hacer lo que estamos tratando de hacer y lo automatiza. Es por que son como instrucciones: le estamos diciendo a las partes automatizadas cómo deseamos que se configure la tarea.
  2. Las tareas: Si necesita iniciar el servidor web, necesitará saber cómo se hace para poder usar el módulo de servicio e iniciar el servidor web por su nombre. Si este está instalando software, entonces debe saber cómo se realiza la instalación en el destino. También necesitará comprender los conceptos básicos de las tareas que se realizan. ¿El software que está instalando tiene una configuración de configuración? ¿Hay varios pasos que requieren condiciones o valores de argumento? Si hay variables que se están pasando

Ejemplo de Playbook

La mejor manera de decir es hacer, por lo que veamos un ejemplo de construcción de un Playbook. Este instalará en el host objetivo, que también será un Centos 7, un servidor web Nginx, le creará un fichero index.html, utilizando una plantilla previa y finalmente encenderá el servicio.

Todos los ficheros se inician con las líneas (—) seguida de:

Name: Es necesario para que el fichero sea leíble

Hosts: Debemos indicar los hosts del inventario que son objetivo.

Become: La declaración “true” la incluimos para garantizar que el servidor Nginx se instala sin problemas.

  1. ---
  2. - name: Instalar nginx
  3.   hosts: host.domain.ip
  4.   become: true

En el mismo nivel de sangría que las tres declaraciones anteriores irán las tareas: declaración, después de lo cual las jugadas se enumeran otra sangría más profunda (por anidamiento YAML). Hay dos tareas enumeradas, pero ambas están utilizando el módulo YUM. La primera tarea de Yum es agregar el repositorio epel-release para que se pueda instalar nginx. Una vez que epel está presente, Yum se utiliza para instalar el paquete nginx.

La declaración “state: present” permite a Ansible verificar primero el estado en el objetivo antes de realizar cualquier otra acción. En ambos casos, si el repositorio o paquete ya está presente, Ansible sabe que no tiene que hacer más para esta tarea y continúa.

  1. tasks:
  2.   - name: Habilitar el repositorio epel-release 
  3.     yum:
  4.       name: epel-release
  5.       state: present
  6.  
  7.   - name: Instalar nginx
  8.     yum:
  9.       name: nginx
  10.       state: present

La página de inicio predeterminada para nginx está bien si deseamos probar que nginx está instalado correctamente, pero es posible que tenga un archivo html básico que le gustaría tener como confirmación. Para simplificar, el archivo de índice de la plantilla está en el mismo directorio desde el que ejecutaremos el Playbook para el ejemplo. El destino es simplemente el predeterminado para nginx sin sitios configurados.

  1. - name: Inser el Indice
  2.     template:
  3.       src: index.html
  4.       dest: /usr/share/nginx/html/index.html

Lo último que hará el Playbook es asegurarse de que se haya iniciado el servicio nginx (y si no, inícielo).

  1. - name: Encender NGiNX
  2.     service:
  3.       name: nginx
  4.       state: started

Ahora sí, veamos todo el contenido explicado:

  1. ---
  2. - name: Instalar nginx
  3.   hosts: host.domain.ip
  4.   become: true
  5.  
  6.   tasks:
  7.   - name: Habilitar el repositorio epel-release 
  8.     yum:
  9.       name: epel-release
  10.       state: present
  11.  
  12.   - name: Instalar nginx
  13.     yum:
  14.       name: nginx
  15.       state: present
  16.  
  17.   - name: Insertar el Indice
  18.     template:
  19.       src: index.html
  20.       dest: /usr/share/nginx/html/index.html
  21.  
  22.   - name: Encender NGiNX
  23.     service:
  24.       name: nginx
  25.       state: started

Conclusiones

Construir un Playboook no es muy complicado y no requiere mucho tiempo. En apenas unas líneas se encarga de instalar un servidor web en un host objetivo, además de añadir un fichero de índice y garantizar que esté encendido. Este se puede lanzar contra uno, diez o cien servidores, todos los que queramos.

Para saber más

¿Qué es Ansible? ¿Para qué sirve?
Instalación de Ansible en GNU Linux
Primeros pasos con Ansible

Fuentes consultadas

Ansible.com – GETTING STARTED: WRITING YOUR FIRST PLAYBOOK