Shell scripts de aprovisionamiento

Podemos configurar nuestra máquina virtual para que ejecute ciertos scripts la primera vez que se inicie, para aprovisionar el software que vaya a usarse en la máquina. Hoy os explico cómo hacerlo mediante shell scripts.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos con máquinas virtuales usando Vagrant, uno de los aspectos más prácticos y útiles que podemos aprovechar es el aprovisionamiento mediante scripts. Aunque a primera vista pueda parecer un detalle menor, el aprovisionamiento es fundamental para automatizar la configuración de nuestras máquinas y evitar tener que hacer instalaciones y configuraciones manuales cada vez que levantamos un entorno.

El aprovisionamiento consiste en ejecutar una serie de comandos o scripts que preparan la máquina virtual para el propósito que tengamos en mente. Por ejemplo, si queremos montar un servidor para pruebas, necesitaremos instalar software como bases de datos, servidores web, lenguajes de programación o cualquier dependencia necesaria. En lugar de hacer todo esto a mano, podemos dejar que Vagrant lo haga automáticamente por nosotros.

Dentro del archivo Vagrantfile, al final, podemos definir cómo se realiza este aprovisionamiento. Vagrant soporta varias herramientas para ello, como Puppet, Chef, Salt o Docker, pero una de las formas más sencillas y directas es usar scripts en shell. Aunque no sean la opción más moderna o elegante, los scripts shell son muy efectivos y fáciles de implementar para tareas rápidas.

Podemos definir un aprovisionamiento en línea (inline), donde escribimos directamente los comandos dentro del Vagrantfile. Por ejemplo, podemos indicarle a Vagrant que actualice los repositorios y luego instale nginx con algo así:

config.vm.provision "shell", inline: <<-SHELL
  apt-get update
  apt-get install -y nginx
SHELL

Es importante destacar que estos scripts deben ejecutarse de forma no interactiva. Esto significa que no pueden esperar a que el usuario confirme acciones con un sí o no, porque el proceso debe ser automático. Por ejemplo, al usar apt-get install, debemos añadir el parámetro -y para que acepte automáticamente la instalación sin pedir confirmación.

Hay casos más complejos, como la instalación de bases de datos tipo MySQL o MariaDB, que suelen pedir que introduzcamos contraseñas durante la instalación. Para que el aprovisionamiento funcione sin interrupciones, debemos configurar estas opciones previamente para evitar que el script se quede esperando una entrada del usuario.

Cuando ejecutamos vagrant up por primera vez, el script de aprovisionamiento se ejecuta automáticamente. Podemos ver cómo se actualizan los repositorios y se instala el software, con las salidas en pantalla diferenciadas por colores para distinguir entre mensajes normales y errores. Si queremos comprobar que, por ejemplo, nginx está funcionando, podemos conectarnos a la máquina virtual y hacer un curl localhost para ver la respuesta del servidor.

Una vez que la máquina está aprovisionada, si la apagamos y la volvemos a encender, el script no se ejecutará de nuevo automáticamente. Esto es porque Vagrant detecta que la máquina ya fue aprovisionada y evita repetir procesos innecesarios o potencialmente destructivos. Si queremos forzar que el aprovisionamiento se ejecute otra vez, podemos usar el comando vagrant provision o iniciar la máquina con vagrant up --provision.

Cuando los scripts de aprovisionamiento se vuelven más complejos, meter todo el código dentro del Vagrantfile puede ser incómodo y poco manejable. Por eso, es mejor separar el script en un archivo externo y referenciarlo desde el Vagrantfile usando la opción path. Por ejemplo, si tenemos un archivo llamado php.sh que instala PHP, podemos indicarle a Vagrant que lo ejecute así:

config.vm.provision "shell", path: "php.sh"

Y el contenido de php.sh podría ser algo como:

#!/bin/bash
apt-get update
apt-get install -y php5

Esto facilita mantener y modificar scripts más largos sin saturar el archivo de configuración principal.

Un detalle a tener en cuenta es que los scripts shell funcionan bien en máquinas virtuales con sistemas Linux como invitados. En el caso de máquinas Windows, los scripts deben ser compatibles con PowerShell o los scripts clásicos de MS-DOS, ya que los scripts de Bash no funcionarán directamente.

En definitiva, usar scripts de aprovisionamiento en shell con Vagrant nos permite automatizar la instalación y configuración de software en nuestras máquinas virtuales de forma rápida y sencilla, evitando tareas manuales repetitivas y facilitando la gestión de entornos de desarrollo o pruebas. Aunque existen herramientas más avanzadas para aprovisionamiento, los scripts shell siguen siendo una opción práctica para muchos casos.

Lista de reproducción
  1. 1
    ¿Qué es Vagrant?
    8 minutos
  2. 2
    Instalamos Vagrant
    4 minutos
  3. 3
    ¿Qué es una box y cómo las obtenemos?
    9 minutos
  4. 4
    Iniciar y detener máquinas virtuales
    12 minutos
  5. 5
    Shell scripts de aprovisionamiento
    11 minutos
  6. 6
    Ansible
    11 minutos