Cómo automatizar el despliegue de aplicaciones con Ansible y Docker

Automatiza el despliegue de aplicaciones con Ansible y Docker usando playbooks, handlers y tags. Infraestructura como código repetible y predecible.

Terminal con un playbook de Ansible y contenedores Docker desplegados en un servidor
Automatización del despliegue de aplicaciones con Ansible y Docker en infraestructura como código.

En el día a día de un equipo de infraestructura, uno de los desafíos más recurrentes es garantizar que el despliegue de aplicaciones sea repetible, predecible y rápido. Cuando combinamos Ansible con Docker, obtenemos una solución potente para orquestar la configuración del servidor y la ejecución de contenedores de manera automatizada. Este artículo explica cómo usar un playbook de Ansible para desplegar una aplicación Dockerizada, evitando pasos manuales y errores humanos.

1. Preparación del entorno con Ansible

Antes de escribir el playbook, es necesario definir el inventario y las variables. Ansible se conecta por SSH a los nodos objetivo, por lo que debemos asegurar conectividad y privilegios de sudo.

  • Inventario: Archivo hosts.ini que agrupa los servidores de producción o staging.
  • Variables: En group_vars/all.yml definimos parámetros como la versión de la imagen Docker, el puerto de exposición y las rutas de volúmenes.

Ejemplo de variable:

docker_image: "mi-app:latest"
app_port: 8080

2. Playbook para instalar Docker y desplegar el contenedor

El playbook principal consta de dos bloques: instalación de Docker (si no está presente) y despliegue del contenedor.

Instalación de Docker

Usamos el módulo ansible.builtin.apt para instalar los paquetes necesarios.

- name: Instalar Docker
  apt:
    name: docker.io
    state: present
  notify: iniciar docker

Despliegue del contenedor

Con el módulo community.docker.docker_container, definimos la imagen, puertos, volúmenes y políticas de reinicio.

- name: Desplegar contenedor de la aplicación
  docker_container:
    name: mi-app
    image: "{{ docker_image }}"
    state: started
    restart_policy: always
    ports:
      - "{{ app_port }}:80"
    volumes:
      - /data/app:/app/data

3. Automatización del ciclo de vida con handlers y tags

Usamos handlers que reinician el contenedor solo cuando la imagen cambia. También aplicamos tags para ejecutar partes específicas del playbook.

  • Handler: Reinicia el contenedor si se actualiza la imagen.
  • Tags: install, deploy, update permiten ejecutar solo la fase necesaria.

Ejemplo de handler:

handlers:
  - name: reiniciar contenedor
    docker_container:
      name: mi-app
      image: "{{ docker_image }}"
      restart: yes

4. Ejecución y verificación del despliegue

Ejecutamos el playbook con el comando:

ansible-playbook -i hosts.ini deploy-app.yml --tags deploy

Ansible mostrará los cambios realizados. Para verificar, agregamos una tarea que consulte el estado del contenedor o la respuesta HTTP.

- name: Verificar que la app responde
  uri:
    url: "http://localhost:{{ app_port }}"
    status_code: 200

Automatizar el despliegue de aplicaciones con Ansible y Docker reduce el tiempo de puesta en producción y elimina la variabilidad manual. Al tratar la infraestructura como código, cada despliegue es idéntico al anterior, facilitando la escalabilidad y el mantenimiento.

💡
¿Necesitas automatizar tus despliegues?
En Mister IT te ayudamos a implementar pipelines de infraestructura como código con Ansible y Docker. Conversemos sobre tu proyecto.