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?
- Edita las variables de la cabecera según tus preferencias (puedes usarlas también con
--extra-vars
). - Lanza la creación del entorno:
ansible-playbook -i tu_inventario entorno-dev.yml -e modo=provision
- 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].