🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Automatización de Despliegues con Ansible y Terraform en 2025

Actualizado el 23 de diciembre de 2025

El ecosistema de la automatización de infraestructura ha madurado de forma espectacular. Si en 2020 combinábamos Ansible y Terraform de manera casi artesanal, en 2025 la integración es nativa, inteligente y, sobre todo, predecible. Este artículo es una guía técnica, sin rodeos, para entender cómo automatizar despliegues completos usando Ansible para la configuración del software y Terraform para el aprovisionamiento de la infraestructura, todo ello dentro de pipelines de CI/CD modernos.

El Estado del Arte en 2025: Infraestructura como Código (IaC) en su Madurez

La infraestructura como código ya no es una opción, es el estándar. En 2025, cualquier equipo que gestione servidores sin IaC se considera, como mínimo, ineficiente. La convergencia entre herramientas de aprovisionamiento (Terraform) y de configuración (Ansible) es total. Ya no hablamos de “orquestar” sino de “declarar el estado deseado” de principio a fin.

Diferencias Clave que Siguen Vigentes

Aunque ambas herramientas se complementan, es crucial entender sus dominios:

  • Terraform: Se encarga del qué. Crea, modifica y destruye recursos de infraestructura: VMs, redes, balanceadores, clústeres Kubernetes.
  • Ansible: Se encarga del cómo. Configura el software dentro de esas máquinas: instala paquetes, despliega aplicaciones, ajusta archivos de configuración, inicia servicios.

[INFO] En 2025, Terraform se ha consolidado como el estándar de facto para el aprovisionamiento multi-cloud, mientras que Ansible sigue siendo imbatible en la capa de configuración y gestión del estado del software, especialmente en entornos híbridos.

Arquitectura de un Despliegue Automatizado con Ansible y Terraform

La clave para una automatización de despliegues exitosa es la separación de responsabilidades. El flujo de trabajo típico en 2025 es el siguiente:

  1. Planificación: Terraform planifica los cambios de infraestructura.
  2. Aprovisionamiento: Terraform aplica los cambios, creando o modificando servidores.
  3. Inventario Dinámico: Terraform genera un inventario en formato JSON o YAML con las IPs y metadatos de los nuevos recursos.
  4. Configuración: Ansible, usando ese inventario dinámico, ejecuta los playbooks de configuración.
  5. Validación: Se ejecutan tests de integración y health checks post-despliegue.

Ejemplo de Pipeline CI/CD (GitLab CI / GitHub Actions)

Un pipeline moderno podría verse así:

stages:
  - terraform-plan
  - terraform-apply
  - ansible-configure
  - integration-tests

terraform-plan:
  stage: terraform-plan
  script:
    - terraform init
    - terraform plan -out=tfplan
  artifacts:
    paths:
      - tfplan

terraform-apply:
  stage: terraform-apply
  script:
    - terraform apply tfplan
    - terraform output -json > inventory.json
  artifacts:
    paths:
      - inventory.json

ansible-configure:
  stage: ansible-configure
  script:
    - ansible-playbook -i inventory.json site.yml --extra-vars "env=production"
  dependencies:
    - terraform-apply

integration-tests:
  stage: integration-tests
  script:
    - pytest tests/

[TIP] Utiliza terraform output -json para generar un inventario que Ansible pueda consumir directamente. Esto elimina la necesidad de scripts externos y garantiza que Ansible siempre se ejecute sobre los recursos recién creados.

Ansible en 2025: Más Allá de la Configuración Simple

Ansible ha evolucionado. Ya no es solo para “instalar paquetes”. En 2025, los playbooks son modulares, reutilizables y se integran con sistemas de gestión de secretos como HashiCorp Vault o AWS Secrets Manager de forma nativa.

Uso de Colecciones y Roles

La organización del código es fundamental. En lugar de un playbook monolítico, usamos roles y colecciones:

ansible/
├── collections/
│   └── requirements.yml
├── roles/
│   ├── common/
│   ├── nginx/
│   ├── app-deploy/
│   └── monitoring/
├── group_vars/
│   └── production.yml
├── site.yml
└── ansible.cfg

Ejemplo de Playbook Moderno con Terraform Inventory

Supongamos que Terraform ha creado tres servidores web. El inventario dinámico (inventory.json) podría tener esta estructura:

{
  "web_servers": {
    "hosts": ["10.0.1.10", "10.0.1.11", "10.0.1.12"],
    "vars": {
      "ansible_user": "admin",
      "env": "production"
    }
  }
}

Entonces, el playbook site.yml se ejecuta contra esos hosts:

- name: Configure web servers
  hosts: web_servers
  become: yes
  vars:
    app_version: "{{ lookup('env', 'CI_COMMIT_TAG') | default('latest') }}"

  tasks:
    - name: Install Nginx and dependencies
      ansible.builtin.apt:
        name:
          - nginx
          - python3-pip
          - ufw
        state: present
        update_cache: yes

    - name: Deploy application binary from artifact repository
      ansible.builtin.get_url:
        url: "https://artifacts.internal/{{ app_version }}/app.tar.gz"
        dest: /opt/app/app.tar.gz
        checksum: "sha256:{{ artifact_checksum }}"

    - name: Ensure Nginx is running and enabled
      ansible.builtin.systemd:
        name: nginx
        state: started
        enabled: yes

    - name: Configure firewall
      community.general.ufw:
        rule: allow
        port: '443'
        proto: tcp

[WARNING] No hardcodees contraseñas ni tokens en los playbooks. Usa siempre ansible-vault o un gestor de secretos externo. En 2025, las auditorías de seguridad son mucho más estrictas.

Terraform en 2025: Gestión de Estado y Módulos Avanzados

Terraform ha mejorado drásticamente su gestión de estado. El uso de Terraform Cloud o Terraform Enterprise es la norma, pero también es común ver equipos usando backends remotos con bloqueo de estado (DynamoDB + S3 para AWS, o Consul para multi-cloud).

Estructura de un Módulo Terraform Reutilizable

# modules/web_server/main.tf
resource "aws_instance" "web" {
  count         = var.instance_count
  ami           = var.ami_id
  instance_type = var.instance_type
  subnet_id     = var.subnet_ids[count.index % length(var.subnet_ids)]

  tags = {
    Name = "web-${count.index + 1}"
    Env  = var.environment
  }

  user_data = templatefile("${path.module}/user_data.sh", {
    env = var.environment
  })
}

output "public_ips" {
  value = aws_instance.web[*].public_ip
}

output "private_ips" {
  value = aws_instance.web[*].private_ip
}

Integración con Ansible mediante Outputs

La magia ocurre en el outputs.tf de tu configuración raíz:

output "ansible_inventory" {
  value = {
    web_servers = {
      hosts = module.web_server.private_ips
      vars = {
        ansible_user          = "admin"
        env                   = var.environment
        artifact_checksum     = var.artifact_checksum
      }
    }
  }
}

Luego, en el pipeline, ejecutas:

terraform output -json ansible_inventory > inventory.json

Esto genera exactamente el formato que Ansible espera.

CI/CD: El Pegamento que Une Todo

La automatización de despliegues sin CI/CD es como tener un coche sin ruedas. En 2025, los pipelines son inteligentes y pueden decidir si ejecutar Terraform, Ansible o ambos en función del cambio.

Estrategias de Despliegue Comunes

  • Blue/Green: Terraform crea un nuevo conjunto de servidores (green), Ansible los configura, y luego se cambia el tráfico.
  • Canary: Se despliega un porcentaje mínimo de servidores nuevos, se validan, y luego se escala.
  • Rolling Update: Ansible actualiza servidores uno a uno, mientras Terraform gestiona el auto-scaling.

Ejemplo de Trigger Inteligente en CI/CD

# Solo ejecutar Terraform si cambian archivos de infraestructura
terraform-apply:
  only:
    changes:
      - terraform/**/*
      - modules/**/*
      - .gitlab-ci.yml

# Ejecutar Ansible siempre que se despliegue una nueva versión de la app
ansible-configure:
  only:
    - tags
    - main

[TIP] Si usas Kubernetes, considera usar Terraform para aprovisionar el clúster y Ansible para configurar los nodos workers (por ejemplo, para instalar drivers de GPU o configuraciones específicas del kernel). Luego, el despliegue de la app lo hace Helm o ArgoCD.

Seguridad y Buenas Prácticas en 2025

La seguridad es un pilar fundamental de cualquier automatización. Aquí tienes las prácticas imprescindibles:

Gestión de Secretos

  • Nunca almacenes secretos en repositorios Git.
  • Usa Terraform Vault Provider para crear secretos dinámicos.
  • Ansible puede leer secretos directamente desde Vault usando el módulo community.hashi_vault.vault_read.

Control de Acceso

  • Principio de mínimo privilegio: Las credenciales de Terraform deben tener permisos solo para crear/modificar los recursos necesarios.
  • Ansible: Usa claves SSH rotadas y almacenadas en un gestor de secretos.
  • Auditoría: Todos los cambios (terraform apply, ansible-playbook) deben quedar registrados en un sistema de logging centralizado (ELK, Datadog, etc.).

Pruebas Automatizadas

  • Terratest o Kitchen-Terraform para probar módulos de Terraform.
  • Molecule para probar roles de Ansible de forma aislada (en contenedores Docker o VMs).
  • Tests de integración post-despliegue: verificar que los endpoints responden, que las bases de datos están accesibles, etc.

El Futuro Inmediato: Despliegues Autónomos

En 2025, estamos viendo los primeros pasos hacia la automatización autónoma. Herramientas como Ansible Lightspeed (con IA generativa) ayudan a escribir playbooks, y Terraform Stacks permiten gestionar infraestructuras completas como si fueran una sola unidad.

Sin embargo, el núcleo sigue siendo el mismo: una combinación robusta de Ansible para la configuración y Terraform para el aprovisionamiento, orquestados por un pipeline de CI/CD bien diseñado.

Conclusión

La automatización de despliegues con Ansible y Terraform en 2025 no es solo una cuestión de eficiencia; es una cuestión de supervivencia operativa. Los equipos que dominan esta combinación son capaces de:

  1. Reducir el tiempo de despliegue de días a minutos.
  2. Eliminar errores humanos en la configuración.
  3. Escalar horizontalmente con total confianza.
  4. Recuperarse de fallos de forma rápida y predecible.

La clave está en la integración: que Terraform hable directamente con Ansible, que los pipelines sean inteligentes y que todo el código sea tratado como un producto, no como un script desechable.

[INFO] Si todavía no has migrado tu infraestructura a este modelo, 2025 es el año para hacerlo. Las herramientas son maduras, la comunidad es enorme y el retorno de inversión es inmediato.

Empieza por un pequeño proyecto: una aplicación web simple. Automatiza su infraestructura con Terraform, su configuración con Ansible, y despliega los cambios mediante un pipeline de CI/CD. Una vez que veas la magia, no querrás volver atrás.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel