Crear una box de Vagrant personalizada desde cero
Aprende a crear desde cero tus propias boxes de Vagrant personalizadas para VirtualBox y VMware Fusion. Esta guía paso a paso lo cubre todo, desde la creación de la máquina virtual hasta el empaquetado, para que puedas crear entornos de desarrollo ligeros y reutilizables que funcionen exactamente como necesitas.

Empecemos por entender qué es un archivo “.box”. Una “.box” de Vagrant no es más que un paquete tar comprimido con gzip que contiene, como mínimo, los metarchivos de la máquina virtual, las imágenes de disco y un metadata.json, que identifica el proveedor para el que se ha creado la box. Si se desea, se pueden empaquetar con la box otros archivos auxiliares opcionales, como un Vagrantfile personalizado.
Comprobación previa
Una comprobación rápida. Las instrucciones se han generalizado y deberían funcionar con la mayoría de los Hosts y Guests de configuración similar. Solo se han probado los que se indican a continuación, así que no hay garantías, ni explícitas ni implícitas.
Nuestro Host
Este artículo da por hecho un entorno de desarrollo en OS X. Salvo que se indique lo contrario, todo el software del Host corresponde a la versión de OS X.
- Apple OS X Mountain Lion (10.7.5)
- VirtualBox 4.2.12
- VMware Fusion 5.0.4
- Vagrant 1.2.2
- Proveedor de VMware Fusion para Vagrant 0.6.3 con una licencia válida.
Posibles Guests
Todos los Guests probados son distribuciones de Linux de 64 bits.
- CentOS 6.4
- Debian 7.0
- Scientific Linux 6.4
- Ubuntu 12.10 Desktop
- Ubuntu 12.10 Server
Crear la máquina virtual
Empieza abriendo el software de virtualización y creando la máquina virtual en la que se basará nuestra box de Vagrant. Al definir la máquina virtual, se recomiendan las siguientes opciones de configuración:
VirtualBox
Crea una nueva máquina virtual en VirtualBox:
- Nombre: vagrant-<distro><arch>, p. ej. vagrant-centos64
- Tipo: Linux
- Versión: <distro> (64-bit)
- Tamaño de memoria: 1024MB*
- Nuevo disco virtual:
- Tipo: VMDK (reservado dinámicamente)
- Tamaño máximo: 40GB
Modifica la configuración de la máquina virtual:
- Desactiva el audio
- Desactiva el USB
- Asegúrate de que el adaptador de red 1 está configurado como NAT
- Añade una regla de reenvío de puertos como la siguiente:
- Nombre: SSH
- Protocolo: TCP
- IP del host:
- Puerto del host: 2222
- IP del invitado:
- Puerto del invitado: 22
- Monta la ISO de la distribución de Linux
VMware Fusion
Crea una nueva máquina virtual con el Asistente:
- Selecciona “Continue without disc”
- Selecciona “Choose a disc or disc image…”
- Localiza la ISO de la distribución que quieres instalar y selecciona “Open”
- Desmarca la casilla “Use Easy Install”
- Elige “Customize Settings”
- Introduce un nombre para el archivo de VMware y selecciona “Save”
Personaliza la configuración de la máquina virtual:
- Activa las carpetas compartidas (Shared Folders)
- Cambia la red a Internet Sharing > Share with my Mac (es decir, NAT)
- Cambia el tamaño del disco a 40 GB y desmarca “Split into 2GB files”
- Desactiva la tarjeta de sonido
- Desactiva “Share Bluetooth devices with Linux”
Instalar el sistema operativo invitado
Arranca la máquina virtual, instala el sistema operativo invitado y personaliza los siguientes ajustes cuando se te solicite:
- Nombre de host: vagrant-<distro><arch>
- Contraseña de root: vagrant
- Nombre completo: vagrant
- Usuario: vagrant
- Contraseña: vagrant
Configurar el sistema operativo invitado
Estos son los pasos mínimos para poner en marcha el sistema operativo invitado. Personalmente, recomiendo no llenar la box de extras si no son necesarios. Los paquetes de software adicionales se pueden añadir con una herramienta de aprovisionamiento. Así la box base se puede reutilizar en distintos proyectos o equipos.
Actualizar el archivo sudoers
El usuario vagrant hará todo el trabajo por nosotros. El usuario vagrant necesita privilegios de sudo sin contraseña y debe poder ejecutarse sin tty (un terminal).
Como la mayoría de las distribuciones de Linux solo asignan el usuario root al grupo sudoers, debemos añadir nuestro usuario vagrant al archivo sudoers. Tendremos que hacerlo como root
$ su -
$ visudo
Las distribuciones Ubuntu añaden a la lista de sudoers el usuario creado durante la instalación. Aunque el usuario tenga permisos de sudo, seguimos necesitando cambiar la configuración.
Añade o modifica las siguientes líneas donde sea necesario:
Defaults:vagrant !requiretty
#Defaults !visiblepw
Defaults env_keep = "SSH_AUTH_SOCK"
vagrant ALL=NOPASSWD: ALL
Guarda los cambios y sal del editor. Sal de la shell de root si es necesario. Ahora el usuario vagrant debería poder usar sudo sin contraseña. Compruébalo ejecutando el siguiente comando en el Terminal:
$ sudo pwd
Actualizar los paquetes
En este punto se recomienda actualizar los paquetes instalados.
RHEL6
$ sudo yum update -y
Debian
$ sudo apt-get upgrade -y
Cuando terminen las actualizaciones, reinicia la máquina virtual para asegurarte de que se aplican correctamente. El siguiente comando en el Terminal reiniciará la máquina virtual de inmediato:
$ sudo shutdown -r now
Descargar la clave insegura de Vagrant
Nuestro usuario vagrant usará una clave SSH para obtener acceso autorizado a la box.
$ mkdir -p /home/vagrant/.ssh
$ chmod 0700 /home/vagrant/.ssh
$ wget --no-check-certificate
https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
-O /home/vagrant/.ssh/authorized_keys
$ chmod 0600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant /home/vagrant/.ssh
Instalar y configurar OpenSSH Server
El usuario vagrant accederá a la box y la configurará mediante SSH.
RHEL6
$ sudo yum install -y openssh-server
$ sudo chkconfig sshd on
Debian
$ sudo apt-get install -y openssh-server
Edita y actualiza la configuración de OpenSSH Server.
$ sudo vi /etc/ssh/sshd_config
Añade o modifica las siguientes líneas:
Port 22
PubKeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
Guarda el archivo y sal. Reinicia el servicio SSH.
RHEL6
$ sudo service sshd restart
Debian
$ sudo service ssh restart
Instalar las Guest Tools
Las herramientas para invitados de la máquina virtual mejoran el rendimiento y la gestión del sistema operativo invitado. Vagrant también usa las Guest Tools para crear recursos compartidos entre el sistema operativo host y el invitado.
Antes de instalar las Guest Additions o las VMware Tools, necesitamos paquetes de desarrollo adicionales para que las herramientas se compilen e instalen correctamente.
RHEL6
$ sudo yum install -y gcc make kernel-devel
Debian
# Server
$ sudo apt-get install -y gcc build-essential linux-headers-server
# Desktop
$ sudo apt-get install -y gcc build-essential linux-headers-$(uname -r)
A continuación, instala las Guest Tools correspondientes al software de nuestra máquina virtual.
VirtualBox
Empieza montando las Guest Additions. Selecciona Devices > Install Guest Additions… en la barra de menús.
$ cd /media/VBOXADDITIONS_4.2.12_84980
$ sudo ./VBoxLinuxAdditions.run
$ sudo umount /media/VBOXADDITIONS_4.2.12_84980 | cd ~
VMware Fusion
Empieza montando las VMware Tools: selecciona Virtual Machines > Install VMware Tools en la barra de menús.
$ sudo mkdir -p /mnt/cdrom
$ sudo mount /dev/cdrom /mnt/cdrom
$ tar xzvf /mnt/cdrom/VMwareTools-9.2.2-893683.tar.gz -C /tmp
$ cd /tmp/vmware-tools-distrib/
$ sudo ./vmware-install.pl
Limpieza
Antes de empaquetar la box, conviene limpiarla para reducir al mínimo su tamaño.
RHEL6
$ sudo yum clean all
Cuando estemos satisfechos con el estado de la máquina virtual, la apagamos para prepararla para el empaquetado.
$ sudo shutdown -h now
Empaquetar nuestra box
Al empaquetar la máquina virtual se creará el archivo .box descrito antes.
VirtualBox
Vagrant crea el archivo .box en el directorio desde el que se ejecuta el comando vagrant package. Si quieres que la box se cree en una ubicación concreta, debes cambiar a ese directorio antes de ejecutar el comando vagrant package. En el siguiente ejemplo empaquetamos un invitado CentOS.
$ mkdir -p ~/workspace/centos64/
$ cd ~/workspace/centos64/
$ vagrant package --base vagrant-centos64
VMware Fusion
Con VMware Fusion, empaquetar la máquina virtual requiere un proceso algo más manual. En el Terminal:
Ve a la ubicación de tu vmwarevm. Por defecto, esta ubicación es ~/Virtual Machines/.
Haz clic con el botón derecho en el archivo .vmwarevm y selecciona Show Package Contents
Crea un archivo llamado metadata.json e introduce el siguiente contenido:
{"provider": "vmware_fusion"}
- Crea un archivo llamado Vagrantfile e introduce el siguiente contenido:
# -*- mode: ruby -*-
# vi: set ft=ruby
Vagrant.configure("2") do |config|
config.vm.provider :vmware_fusion do |v, override|
v.gui = true
end
end
- A continuación, optimizamos la box para reducir su tamaño:
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual Disk.vmdk
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual Disk.vmdk
- Por último, comprime la box:
$ tar cvzf package.box ./*
Probar a arrancar la box
$ vagrant box add testbox package.box
$ vagrant init testbox
$ vagrant up
Si la box se ha creado correctamente, vagrant up mostrará la siguiente salida.
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'testbox'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
Para iniciar sesión en el invitado desde nuestro host, podemos ejecutar:
$ vagrant ssh