Escribir su primer playbook

AnsibleBeginner
Practicar Ahora

Introducción

En el laboratorio anterior, ejecutó un único comando (ansible ... -m ping). Aunque resulta útil para comprobaciones rápidas, el verdadero potencial de Ansible está en los playbooks.

Un playbook es un archivo de texto que contiene instrucciones de automatización. A diferencia de un script de shell normal, un playbook suele centrarse en el estado final deseado, en lugar de describir cada paso de bajo nivel de los comandos.

Este modelo basado en el estado deseado es una de las ideas más importantes de Ansible. En lugar de indicar «ejecute exactamente estos comandos», normalmente se describe la condición que debe cumplirse cuando finalice la automatización.

Los playbooks se escriben en YAML, un formato de datos legible para las personas. Esto facilita revisar, compartir y mantener la automatización.

En este laboratorio, escribirá un playbook que convertirá un servidor en un servidor web mediante las siguientes acciones:

  1. Instalar Nginx, un servidor web muy utilizado.
  2. Comprobar que el servicio de Nginx esté en ejecución.

Después, ejecutará este playbook para configurar su máquina local.

Crear el archivo del playbook

Comenzaremos por crear el archivo del playbook. Por convención, el playbook principal suele llamarse site.yml.

Primero, asegúrese de encontrarse en el directorio del proyecto:

cd ~/project

Ahora, cree y abra un archivo nuevo llamado site.yml con el editor de texto nano:

nano site.yml

Escriba tres guiones al principio del archivo. Esto marca el inicio de un documento YAML.

---

Reglas de YAML que debe recordar:

  • La indentación es fundamental. Debe utilizar espacios, normalmente 2, no tabulaciones. Si la indentación es incorrecta, Ansible mostrará un error.
  • Guarde el archivo con frecuencia. En nano, pulse Ctrl+O y después Enter para guardarlo, pero mantenga el archivo abierto para los pasos siguientes.

Definir el play

Un playbook consta de uno o varios «plays». Un play relaciona un grupo de hosts con las tareas que desea ejecutar en ellos.

Esta relación entre el grupo de hosts y las tareas permite que un mismo playbook se aplique tanto a una máquina como a muchas. La lógica permanece en un solo lugar, mientras que el inventario determina dónde se aplica.

En el archivo site.yml, añada las siguientes líneas debajo de ---.

---
- hosts: webservers
  become: yes

Explicación del código:

  • - hosts: webservers: Indica a Ansible: «Ejecute estas instrucciones en cada servidor incluido en el grupo [webservers] de mi inventario».
  • become: yes: Equivale a escribir sudo delante de un comando. Otorga a Ansible privilegios de root, necesarios para instalar software.

Asegúrese de que - hosts comience exactamente al principio de la línea, sin espacios antes del guion.

Guarde el archivo (Ctrl+O, Enter).

Añadir una tarea de instalación

Ahora debemos indicar a Ansible qué debe hacer. Para ello, añadiremos una lista de tareas. Cada tarea utiliza un módulo.

Usaremos el módulo apt, ya que trabajamos en Ubuntu, para instalar Nginx.

Actualice site.yml para que tenga el siguiente contenido:

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

Explicación del código:

  • tasks:: Inicia la lista de tareas.
  • - name: ...: Es una descripción para las personas. Se mostrará en pantalla cuando ejecute el playbook.
  • apt:: Llama al módulo apt.
  • name: nginx: Especifica el paquete que queremos instalar.
  • state: present: Esta es la parte «declarativa» fundamental. No estamos diciendo «instálelo ahora», sino «asegúrese de que esté presente».
    • Si no está instalado, Ansible lo instala.
    • Si ya está instalado, Ansible no hace nada. Esta propiedad se denomina idempotencia.

La idempotencia es esencial en la gestión de la configuración. Significa que puede ejecutar la misma automatización repetidamente de forma segura y obtener resultados coherentes, sin efectos secundarios duplicados.

Compruebe la indentación:

  • tasks debe estar alineado con become.
  • - name debe estar indentado 2 espacios.
  • apt debe estar alineado con name.
  • name y state deben tener una indentación mayor que apt.

Guarde el archivo.

Añadir una tarea para el servicio

No basta con instalar el software; también debemos asegurarnos de que el programa esté en ejecución. Para ello, utilizaremos el módulo service.

Esto también muestra cómo los playbooks expresan el estado del sistema por capas. Una tarea garantiza que el paquete exista y otra garantiza que el servicio esté activo. Juntas describen el estado final que el host debe alcanzar.

Añada una segunda tarea a la lista de site.yml.

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started

Explicación del código:

  • service:: Este módulo administra servicios del sistema, de forma similar a systemctl.
  • state: started: Garantiza que el servicio esté en ejecución. Si está detenido, Ansible lo inicia.

Importante: El - de la segunda tarea debe estar exactamente alineado con el - de la primera tarea.

Guarde el archivo y salga de nano (Ctrl+X, después Y y, por último, Enter).

Ejecutar el playbook

Ahora viene la parte más interesante: ¡ejecutar la automatización!

Utilizaremos el comando ansible-playbook. Debemos indicarle qué playbook ejecutar (site.yml) y qué inventario utilizar (hosts.ini).

Ejecute este comando:

ansible-playbook site.yml -i hosts.ini

Observe la salida. Verá lo siguiente:

  1. Gathering Facts: Ansible comprueba primero los detalles del sistema.
  2. Install nginx: Mostrará changed en amarillo porque tuvo que instalar el paquete.
  3. Start nginx: Mostrará changed en amarillo si tuvo que iniciar el servicio.

Si ejecuta exactamente el mismo comando una segunda vez, la salida aparecerá en verde y mostrará ok. Esto significa: «Todo se encuentra ya en el estado deseado, por lo que no cambié nada».

Por último, compruebe manualmente que Nginx esté en ejecución:

systemctl status nginx

Debería ver Active: active (running).

Resumen

En este laboratorio, escribió su primer playbook de Ansible. Aprendió lo siguiente:

  1. Sintaxis YAML: Cómo estructurar un playbook con la indentación adecuada.
  2. Plays: Cómo definir hosts, es decir, dónde ejecutar las tareas, y become, es decir, utilizar sudo.
  3. Tareas: Cómo utilizar módulos como apt para instalar software y service para iniciar servicios.
  4. Idempotencia: El concepto de que ejecutar el playbook varias veces es seguro y estable.

Ha pasado de ejecutar comandos manualmente a definir la «infraestructura como código».