Cómo crear un playbook Ansible para deployment

Clase 22 de 22Curso de Despliegue de Aplicaciones Python en la Nube

Resumen

Automatiza con confianza el deployment de aplicaciones en la nube: con Ansible y archivos YAML reduces errores, ahorras tiempo y obtienes procesos repetibles. Aquí verás cómo pasar de comandos manuales a un playbook idempotente que actualiza paquetes, instala dependencias y clona tu repositorio con Git.

¿Por qué Ansible acelera el deployment en YAML?

La premisa es clara: recordar todos los comandos y archivos modificados en cada cambio es inviable. Ansible centraliza el proceso en un único playbook en YAML que define un conjunto de tareas a ejecutar en uno o varios servidores.

¿Cómo instalar y ejecutar ansible playbook?

  • Instala Ansible con pip en tu equipo local.
pip install ansible
  • Ejecuta el playbook indicando el inventario de hosts y el archivo YAML.
ansible-playbook -i hosts deploy.yml

¿Qué significa idempotencia y el reporte ok vs changed?

  • Idempotencia: si algo ya está en el estado deseado, no cambia.
  • Reporte de Ansible: muestra tareas en estado ok si no hubo cambios y changed si aplicó modificaciones.
  • Beneficio clave: puedes re-ejecutar el playbook con seguridad y consistencia.

¿Cómo definir el inventario hosts y variables seguras?

Primero configura un archivo llamado hosts. Allí listas los servidores de destino y sus parámetros de conexión: IP pública, usuario y llave privada. También puedes declarar variables para el grupo.

¿Cómo estructurar el archivo hosts?

  • Define un grupo, por ejemplo: web servers.
  • Especifica IP, usuario y llave de SSH.
[web servers] IP_PUBLICA ansible_user=USUARIO ansible_ssh_private_key_file=RUTA/LLAVE.pem
  • Puedes gestionar múltiples hosts o aplicaciones en el mismo inventario.

¿Cómo declarar variables de grupo con vars?

  • Añade variables para rutas y llaves de deployment.
[web servers:vars] app_directory=/ruta/de/la/app deploy_key=/ruta/en/el/servidor/llave_deployment
  • Estas variables se referencian en el playbook con la sintaxis de Jinja2: "{{ variable }}".

¿Cómo crear un playbook idempotente con apt y git?

Crea un archivo llamado deploy.yml. Define el nombre, los hosts objetivo y activa become: yes para ejecutar con privilegios de sudo cuando sea necesario. Luego agrega las tasks en orden.

¿Cómo actualizar e instalar paquetes con apt?

  • Actualiza la caché de paquetes con apt.
  • Instala dependencias como nginx mediante listas.
--- - name: Despliegue básico hosts: web servers become: yes tasks: - name: Actualizar paquetes apt apt: update_cache: yes - name: Instalar paquetes necesarios apt: name: - nginx # agrega más paquetes si lo necesitas state: present
  • Al re-ejecutar, si ya están instalados, verás ok en lugar de changed gracias a la idempotencia.

¿Cómo clonar el repositorio con git y keyfile?

  • Usa la tarea git para clonar el proyecto en tu directorio de aplicación.
  • Controla la rama con el parámetro version.
  • Autentica con tu keyfile de deployment.
- name: Clon repo git: repo: "REPO_DEL_PROYECTO" dest: "{{ app_directory }}" version: "RAMA_O_COMMIT" key_file: "{{ deploy_key }}"
  • Si cambias la rama (por ejemplo, de develop a una feature), Ansible marcará la tarea como changed cuando actualice el directorio.
  • Nota práctica mencionada: puede haber verificaciones de host al clonar con llaves. Asegura que la llave esté correctamente instalada y autorizada en el servidor.

¿Cómo usar become para sudo en tareas?

  • Agrega become: yes en el nivel del playbook para aplicar sudo a todas las tareas.
  • Evitas escribir sudo comando por comando y garantizas permisos adecuados.

Habilidades y conceptos aplicados:

  • Automatización de deployment con Ansible y YAML.
  • Inventario de hosts con IP pública, usuario y llave privada.
  • Variables de grupo con :vars y referencia con "{{ variable }}".
  • Tareas con módulos apt y git para actualización, instalación y clonación.
  • Idempotencia: reporte ok vs changed y re-ejecución segura.
  • Uso de become para permisos de sudo.
  • Consideraciones de SSH y verificación de host al clonar.

¿Te gustaría que ampliemos el playbook para Django, Flask o FastAPI, o que integremos Ansible con GitHub Actions? Cuéntame en los comentarios qué stack quieres automatizar y en qué parte te gustaría profundizar.