Automatizando entornos de desarrollo con Ansible: ¡Crea y destruye entornos completos en minutos!

Automatizando entornos de desarrollo con Ansible: ¡Crea y destruye entornos completos en minutos!

¿Alguna vez has soñado con levantar un entorno de desarrollo completo —servidor web, base de datos, usuarios y permisos— en cuestión de minutos y, cuando terminas de probar, destruirlo todo con la misma facilidad? Hoy te propongo un reto de nivel intermedio-avanzado en Ansible: un playbook orquestador que crea y destruye entornos de desarrollo completos, algo ideal para equipos de QA, desarrolladores, formaciones, o para testear «sin miedo» y ahorrar tiempo y errores.

¿Por qué automatizar la creación y destrucción de entornos de desarrollo?

  • Consistencia: Olvida el típico «en mi máquina funciona». Todos tienen el mismo entorno.
  • Rapidez: Pasa de horas replicando pasos manuales a minutos (¡o segundos!) de despliegue/destrucción.
  • Limpieza: Evita servidores olvidados, bases de datos con datos residuales, y mantiene tus sistemas de pruebas limpios.
  • Perfecto para CI/CD: Integra este playbook en tus pipelines para automatizar los tests de integración.

¿Qué hace este playbook?

El siguiente playbook de Ansible realiza las siguientes tareas:

  • Crea (o destruye) un usuario específico de desarrollo.
  • Instala y configura Apache/Nginx (elige tu opción en una variable).
  • Instala y configura MySQL o PostgreSQL (de nuevo configurable) y crea la base de datos y usuario asociado.
  • Despliega una página de ejemplo y permisos adecuados.
  • Permite lanzar en modo provisión (crea todo) o limpieza (borra todo).

Este es el tipo de playbook que suele usarse en entornos profesionales bajo demanda o en proyectos de formación, y es una excelente práctica para dominar Variables, Condiciones y Roles en Ansible.

Playbook completo: entorno-dev.yml

---
- hosts: desarrolladores
  become: yes
  vars:
    modo: "provision"  # Cambia a "destroy" para limpiar el entorno
    usuario_dev: devtest
    password_usuario: "Dev2025!"
    servidor_web: "nginx"  # Alternativa: "apache"
    gestor_bd: "mysql"     # Alternativa: "postgresql"
    nombre_bd: "devdb"
    usuario_bd: "devdbuser"
    password_bd: "DbPass2025!"
    doc_root: "/var/www/devsite"

  tasks:
    - name: Crear o eliminar usuario de desarrollo
      user:
        name: "{{ usuario_dev }}"
        password: "{{ password_usuario | password_hash('sha512') }}"
        state: "{{ 'present' if modo == 'provision' else 'absent' }}"
        shell: /bin/bash

    - name: Instalar servidor web (Nginx o Apache)
      package:
        name: "{{ item }}"
        state: "{{ 'present' if modo == 'provision' else 'absent' }}"
      loop: "{{ [ 'nginx' ] if servidor_web=='nginx' else [ 'apache2' ] }}"

    - name: Crear directorio para sitio web
      file:
        path: "{{ doc_root }}"
        state: "{{ 'directory' if modo == 'provision' else 'absent' }}"
        owner: "{{ usuario_dev }}"
        group: "{{ usuario_dev }}"
        mode: "0755"

    - name: Subir página de ejemplo
      copy:
        dest: "{{ doc_root }}/index.html"
        content: "

¡Hola, este es tu entorno de desarrollo!

\n" owner: "{{ usuario_dev }}" group: "{{ usuario_dev }}" mode: "0644" when: modo == "provision" - name: Instalar gestor de base de datos package: name: "{{ item }}" state: "{{ 'present' if modo == 'provision' else 'absent' }}" loop: "{{ ['mysql-server'] if gestor_bd=='mysql' else ['postgresql'] }}" - name: Crear/eliminar base de datos y usuario (MySQL) community.mysql.mysql_db: name: "{{ nombre_bd }}" state: "{{ 'present' if modo == 'provision' else 'absent' }}" when: gestor_bd == 'mysql' - name: Crear/eliminar usuario de base de datos (MySQL) community.mysql.mysql_user: name: "{{ usuario_bd }}" password: "{{ password_bd }}" priv: "{{ nombre_bd }}.*:ALL" state: "{{ 'present' if modo == 'provision' else 'absent' }}" when: gestor_bd == 'mysql' - name: Crear/eliminar base de datos y usuario (PostgreSQL) community.postgresql.postgresql_db: name: "{{ nombre_bd }}" state: "{{ 'present' if modo == 'provision' else 'absent' }}" when: gestor_bd == 'postgresql' - name: Crear/eliminar usuario de base de datos (PostgreSQL) community.postgresql.postgresql_user: name: "{{ usuario_bd }}" password: "{{ password_bd }}" db: "{{ nombre_bd }}" priv: "ALL" state: "{{ 'present' if modo == 'provision' else 'absent' }}" when: gestor_bd == 'postgresql'

¿Cómo se utiliza?

  1. Edita las variables de la cabecera según tus preferencias (puedes usarlas también con --extra-vars).
  2. Lanza la creación del entorno:
    ansible-playbook -i tu_inventario entorno-dev.yml -e modo=provision
  3. Cuando hayas terminado, destruye el entorno:
    ansible-playbook -i tu_inventario entorno-dev.yml -e modo=destroy

Consejillo extra: troubleshooting

  • Si ves errores de permisos en las tareas de base de datos, revisa que tu usuario Ansible tenga privilegios sudo y los módulos estén instalados. Añade roles o instala los módulos community.mysql/community.postgresql según el gestor elegido.
  • ¿Problemas de firewall? Añade una tarea para abrir los puertos 80 (web) y los del gestor SQL si lo necesitas, esto puede variar según la distro.
  • ¿Multiusuario/multientorno? Puedes clonar esta base y parametrizar más aún los nombres según el entorno/proyecto.

¡Comparte mejoras!

¿Has personalizado este playbook? ¿Te gustaría ver una versión con Docker, integración con herramientas de CI, o despliegue en la nube? ¡Déjalo en los comentarios!


Inspirado por los últimos avances en automatización vistos en Red Hat Ansible Automates Santiago 2025 y sintetizando buenas prácticas recomendadas por expertos de la comunidad[1][2][3].

Avatar

Por Mid