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.

      Cómo crear un playbook Ansible para deployment