Instalar una caja de Homestead desde un equipo local

Introducción

Homestead es una solución provista por Laravel que se basa en Virtualbox para proveer y gestionar una máquina virtual Linux que incluye las principales herramientas que un desarrollador web va a utilizar durante su labor.  El uso de esta imágen evita que los desarrolladores tengan que instalar herramienta por herramienta directamente en el sistema operativo de su equipo de trabajo.

La gestión de estas imágenes se realiza a través de Vagrant quien provee un catálogo de imágenes (cajas) desde el cual se pueden instalar fácilmente, haciendo realmente ágil el despliegue de múltiples ambientes de trabajo, los cuales son exactamente iguales.

La descarga de la caja se realiza con una única instrucción y se descarga desde Internet.  Esto es habitualmente beneficioso ya que cada desarrollador obtiene la versión mas actual posible de la imágen Homestead, sin embargo cuando se desea realizar la instalación de múltiples máquinas en una red local, cada una de las máquinas se ve obligada a descargar de manera individual la caja, siendo una descarga de mas de 1.5 GB.

Para facilitar este proceso y evitar las múltiples descargas desde Internet se me ocurren dos opciones.

  1. Forzar una instalación que recurra a una descarga desde la red local.
  2. Utilizar un proxy-caché y almacenar en él la descarga.

En el presente artículo se describirán los pasos necesarios para evitar que la descarga de la caja o imágen de Virtualbox de Homestead se realice en múltiples ocasiones desde Internet y se realicen en cambio, desde la red local.

Estos pasos reemplazan a la siguiente instrucción que hace parte del proceso de instalación de Homestead.

$ vagrant box add laravel/homestead

Determinar la versión de la caja de Homestead

Verificar cual es la útlima versión disponible de la caja, Homestead en este caso, que se desea instalar.  Para hacer esto, consulte el catálogo de Vagrant para dicha caja.

En este  caso, la última versión de Homestead es la 6.3.0.

Descargar la imágen de la caja de Homestead

Basado en la versión que se desea descargar, identificada en el paso anterior, componer y descargar el siguiente URL.

$ wget https://app.vagrantup.com/laravel/boxes/homestead/versions/6.3.0/providers/virtualbox.box -O homestead_6.3.0_virtualbox.box

Crear el archivo de metadatos

El archivo de metadatos le indicará a Vagrant la información de la caja que se estará ofreciendo a través de la red local.

$ vi metadata.json
{
  "name": "laravel/homestead",
  "description": "Laravel Homestead",
  "versions": [
    {
      "version": "6.3.0",
      "providers": [
        {
          "name": "virtualbox",
          "url": "http://192.168.10.100/homestead_6.3.0_virtualbox.box",
          "checksum_type": "sha1",
          "checksum": "5e442f42dbe76a72c08fd3273d59871df2ca4463"
        }
      ]
    }
  ]
}

Este archivo no necesita ubicarse obligatoriamente en el mismo directorio en el cual se encuentra el archivo de la caja, sin embargo si deben personalizarse de manera adecuada los siguientes valores.

  1. version, debe corresponder con la versión de la caja que se descargó en el paso anterior.
  2. url, debe corresponder exactamente con la ubicación del archivo de la caja que se descargó en el paso anterior.  No olvidar ajustar la dirección IP del servidor local de la caja según la dirección  que le sea asignada al equipo particular.
  3. checksum, debe corresponder con la suma de verificación SHA1 del archivo de la caja descargado en el paso anterior.  Para obtener este valor se debe ejecutar el siguiente comando.
    $ openssl sha1 ~/Downloads/homestead_6.3.0_virtualbox.box

Publicar los metadatos de la caja a través de web

Publicar el directorio donde se encuentra el archivo metadata.json y el archivo de la caja –homestead_6.3.0_virtualbox.box– a través de la web.  Para esto es posible utilizarse un servidor formal como Apache o Nginx, o un servidor de desarrollo como los incluidos en PHP y Python (versión 2.x).

Por ejemplo, utilizando el servidor incorporado en PHP, la ejecución se realizaría de la siguiente manera.

$ php -S 192.168.10.100:8080 -t ~/Downloads/

No olvidar ajustar los siguientes valores de acuerdo con las necesidades específicas.

Dirección IP del servidor 192.168.10.100 Dirección IP del equipo que va a actuar como servidor de la caja de Vagrant.
Puerto 8080 Puerto a través del cual se va a acceder al servicio web temporal.
Origen de archivos ~/Downloads/ Directorio en el cual se encuentran los archivos que van a ser públicos: metadata.json y el archivo de la caja.

Descargar las cajas desde equipos locales

Desde equipos ubicados en la red local e interesados en instalar la caja de Homestead, ejecutar el siguiente comando.

$ vagrant box add laravel/homestead http://192.168.10.100:8080/metadata.json --name=laravel/homestead

Una vez descargada la caja, verificar que se encuentra correctamente registrada con Vagrant.

$ vagrant box list

laravel/homestead (virtualbox, 6.3.0)

Ajustar el origen real de la caja

Si se desea opcionalmente, que Vagrant realice futuras comprobaciones de versiones con el catálogo en línea de Vagrant (en lugar de la ubicación local), realizar el siguiente ajuste en el directorio en cual se instaló la caja, reemplazando el contenido del archivo metadata_url.

$ vi boxes/laravel-VAGRANTSLASH-homestead/metadata_url

https://vagrantcloud.com/laravel/homestead

En Windows encontrará el archivo metadata_url bajo la siguiente ruta.

c:\users\USUARIO.vagrant.d\boxes\laravel-VAGRANTSLASH-homestead\

Recursos

Descargar manualmente imágenes (boxes) de Vagrant desde el catálogo de HashiCorp’s Atlas

Obtener la box

Para descagar manualmente la imágen base (box) de una máquina virtual desde el catálogo de HashiCorp’s Atlas para ser utilizada con Vagrant se deben seguir los siguientes pasos.

  1. Ubicar la box que se desea descargar en el catálogo.
  2. Identificar el URL de la box deseada.

    Por ejemplo: https://atlas.hashicorp.com/thdengops/boxes/ubuntu-14.04-dev.

  3. Teniendo en cuenta la información mostrada en el sitio web, agregar a la URL la versión y el proveedor (sistema de virtualización) de la box que se desea descargar.

    Vagrant Box Info

    De la manera URL/versions/{VERSION}/providers/{PROVEEDOR}

    Para el caso del ejemplo sería entonces: https://atlas.hashicorp.com/thdengops/boxes/ubuntu-14.04-dev/versions/0.0.7/providers/virtualbox.box

Crear una máquina virtual a partir de una box local

Se debe agregar la box local al sistema de boxes de Vagrant, este procedimiento se debe realizar una unica vez.

$ vagrant box add miBox /ruta/boxes/ubuntu-14.04-dev.virtualbox.box

Posteriormente se crea el Vagrantfile para la instancia de la máquina virtual.

$ vagrant init miBox

Finalmente, una vez configurado apropiadamente el Vagrantfile, se inicia la máquina virtual.

$ vagrant up

Recursos

Los primeros 10 minutos con Vagrant

Instalación

Instalar Virtualbox como prerequisito si aún no se cuenta con este software.

$ sudo aptitude install dkms virtualbox

Es recomendable instalar su correspondiente Extension Pack.

Para el caso de Ubuntu/Debian descargar el archivo .deb correspondiente a la arquitectura desada del sitio web de descargas e instalarlo localmente.

$ sudo dpkg -i vagrant_*.deb

Obtener la caja (box) a obtenerse

Una box hace referencia a la máquina virtual base que se utilizará para crear la que se asociará al proyecto.

$ vagrant box add ubuntu/trusty32

En este caso ubuntu/trusty32 hace referencia al nombre de la imagen que va a descargarse.  Pueden  utilizarse otras imágenes que se encuentran en linea gracias al repositorio oficial de Vagrant.

Los archivos asociados a estas imágenes son descargados bajo el directorio ~/.vagrant.d/boxes.

Crear el archivo de configuración

En el directorio del proyecto ejecutar el siguiente comando

$ vagrant init ubuntu/trusty32

Esto básicamente crea una versión base del archivo Vagrantfile para configurar la máquina virtual y asigna automáticamente la box a utilizarse en el proyecto.

$ vi VagrantFile

   ...
   config.vm.box = "ubuntu/trusty32"
   ...

Una vez se cree la máquina virtual por primera vez (con el primer vagrant up) sus archivos quedarán por defecto bajo ~/VirtualBox\ VMs/.

Reenvío de puertos

Para configurar el reenvío de puertos entre la máquina virtual y la máquina física se deben agregar una o mas opciones config.vm.network al archivo Vagrantfile.

$ vi VagrantFile

   ...
   config.vm.network :forwarded_port, guest: 80, host: 8080
   config.vm.network :forwarded_port, guest: 443, host: 80443
   ...

Configurar la interfaz de red

El acceso a la red de la máquina virtual puede configurarse de manera privada (sólo el host y otras máquinas pueden acceder a ella) o de manera pública en la cual cualquier equipo en la red puede interactúar con la máquina virtual.

Configuración privada

Es posible utilizar una dirección IP estática de la siguiente manera.

$ vi VagrantFile

   ...
   config.vm.network "private_network", ip: "192.168.1.100"
   ...

O una dirección IP dinámica.

$ vi VagrantFile

   ...
   config.vm.network "private_network", type: "dhcp"
   ...

Configuración pública

Al igual que con la configuración privada, es posible asignar una dirección IP estática.

$ vi VagrantFile

   ...
   config.vm.network "public_network", ip: "192.168.1.100"
   ...

O una dirección IP dinámica basada en el DHCP de la red.

$ vi VagrantFile

   ...
   config.vm.network "public_network"
   ...

Directorios sincronizados

Por defecto el directorio /vagrant de la máquina virtual se encuentra sincronizado con el directorio del proyecto en la máquina física, es decir, en este directorio se deberán ubicar los archivos que deberán perdurar en el tiempo.

Es posible especificar otros directorios sincronizados mediante diferentes métodos.

Gestión de la máquina virtual

Iniciar la máquina virtual

$ vagrant up

Acceder a la máquina virtual a través de una sessión de SSH

$ vagrant ssh

Suspender una máquina virtual activa

$ vagrant suspend

En este caso el estado de la máquina en memoria (además de sus archivos) es almacenado en disco.  Su reinicio es muy rápido (entre 5 y 10 segundos).

Detener una máquina virtual activa

$ vagrant halt

Este comando realiza un apagado limpio de la máquina virtual.  El reinicio de la máquina toma un poco mas de tiempo.

Destruir una máquina virtual

$ vagrant destroy

Este comando apaga abruptamente la máquina virtual si esta se encuentra activa y remueve todos los archivos asociados a la misma sin incluir las carpetas compartidas (/vagrant).

Obtener ayuda de los comandos vagrant

Para listar los comandos disponibles utilice el siguiente comando.

$ vagrant list-commands

Para obtener ayuda adicional sobre un comando en especial utilice la siguiente variante.

$ vagrant COMANDO -h

Recursos