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:
- Instalar Nginx, un servidor web muy utilizado.
- 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, pulseCtrl+Oy despuésEnterpara 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 escribirsudodelante 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óduloapt.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:
tasksdebe estar alineado conbecome.- namedebe estar indentado 2 espacios.aptdebe estar alineado conname.nameystatedeben tener una indentación mayor queapt.
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 asystemctl.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:
- Gathering Facts: Ansible comprueba primero los detalles del sistema.
- Install nginx: Mostrará
changeden amarillo porque tuvo que instalar el paquete. - Start nginx: Mostrará
changeden 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:
- Sintaxis YAML: Cómo estructurar un playbook con la indentación adecuada.
- Plays: Cómo definir
hosts, es decir, dónde ejecutar las tareas, ybecome, es decir, utilizarsudo. - Tareas: Cómo utilizar módulos como
aptpara instalar software yservicepara iniciar servicios. - 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».


