Aprovisionar máquinas virtuales puede ser una tarea tediosa si nos limitamos a usar scripts tradicionales, pero con Ansible podemos hacerlo de una forma mucho más elegante y declarativa. Ansible nos permite definir el estado deseado de una máquina mediante archivos en formato YAML, donde especificamos qué paquetes deben estar instalados, qué usuarios deben existir o qué archivos deben contener cierto contenido. En lugar de escribir comandos imperativos, simplemente declaramos cómo queremos que esté configurada la máquina, y Ansible se encarga de aplicar los cambios necesarios para que así sea.
Para integrar Ansible con Vagrant, basta con modificar el archivo de configuración de Vagrant para que utilice Ansible como método de aprovisionamiento. Esto se hace con la directiva config.vm.provision, indicando que el tipo es Ansible y especificando el playbook que queremos ejecutar. El playbook es un archivo YAML donde definimos las tareas que Ansible debe realizar en la máquina virtual.
Un ejemplo básico de playbook podría ser instalar Git usando el módulo apt de Ansible, que se encarga de gestionar paquetes en sistemas basados en Debian. En este caso, declaramos que el paquete git debe estar instalado y que se actualice la caché de paquetes antes de la instalación. Si Git ya está instalado, Ansible no hará nada; si no, lo instalará automáticamente.
- hosts: all
tasks:
- name: Instalar Git
apt:
name: git
state: present
update_cache: yes
Cuando necesitamos instalar varios paquetes, podemos aprovechar la funcionalidad de Ansible para iterar sobre una lista de elementos usando with_items. Por ejemplo, si queremos instalar PostgreSQL y PHP5 FPM, podemos definir una tarea que se ejecute para cada paquete de la lista, evitando repetir código.
- hosts: all
tasks:
- name: Instalar herramientas de la aplicación web
apt:
name: "{{ item }}"
state: present
with_items:
- postgresql
- php5-fpm
Es importante tener en cuenta que Ansible no es compatible de forma nativa con Windows, aunque puede funcionar a través del subsistema Linux en Windows 10. Además, para que Ansible pueda ejecutar tareas que requieren permisos elevados, debemos indicarle que use sudo mediante la opción become: true. Esto puede configurarse globalmente o por tarea.
- hosts: all
become: true
tasks:
- name: Instalar Git con permisos elevados
apt:
name: git
state: present
update_cache: yes
Otra ventaja de Ansible es que solo realiza cambios cuando detecta que el estado actual no coincide con el declarado. Por ejemplo, si ya hemos instalado Git y las herramientas necesarias, Ansible no volverá a ejecutar esas tareas, lo que hace que el aprovisionamiento sea eficiente y repetible.
Además de gestionar paquetes, podemos crear usuarios en la máquina virtual con el módulo user. Por ejemplo, para crear un usuario llamado aplicacion con un comentario descriptivo, declaramos la tarea así:
- hosts: all
become: true
tasks:
- name: Crear usuario para la aplicación
user:
name: aplicacion
comment: cuenta de la aplicación
state: present
Si el usuario ya existe, Ansible no hará nada; si no, lo creará automáticamente. Esto nos permite mantener la configuración de la máquina siempre en el estado deseado sin preocuparnos por ejecutar comandos manualmente.
Para que el playbook se ejecute cada vez que levantamos la máquina virtual, podemos añadir la opción run_always en la configuración de Vagrant. De esta forma, aunque la máquina ya esté aprovisionada, Ansible revisará el estado y aplicará cambios si es necesario.
En definitiva, combinar Vagrant con Ansible nos ofrece una forma poderosa y elegante de aprovisionar máquinas virtuales, declarando estados deseados en YAML y dejando que Ansible se encargue de aplicar los cambios. Esto facilita la automatización, la repetibilidad y el mantenimiento de entornos de desarrollo o producción.