Vagrant - Parte 2 Creando nuestra box

develop linux vagrant debian

Continuando con el tema de Vagrant Vagrant - Parte 1 Instalación, veremos como crear nuestra imagen o box, para despues alojarla en Vagrant Cloud. La crearemos con Virtualbox y la ISO de Debian 9.3.0.

Contenido de una imagen o box

Antes de continuar veamos que compone un box de vagrant, podemos descargar cualquier imagen de forma local, por ejemplo para descargarla y compartirla mediante un USB en situaciones con una mala conexión a internet.

Descargando la imagen

Para mostrar un ejemplo voy a describir como descargar una imagen que subí previamente, para descargarla podemos ir al sitio de vagrant cloud https://app.vagrantup.com/jaxmetalmax/boxes/debian-stretch-9.3.0-x64/ esta URL nos muestra la información de la imagen de Debian 9.3.0, para descargar directamente la imagen, agregamos a la url "providers/virtualbox.box" quedando de la siguente manera: https://app.vagrantup.com/jaxmetalmax/boxes/debian-stretch-9.3.0-x64/providers/virtualbox.box y nos descargará el archivo .box, nos mostrará un archivo sin extensión, podemos agregar la extensión manualmente al guardarlo.

Contenido

Una vez descargado podemos ver su contenido usando alguna herramienta que nos permita manejar archivos .tar.gz y descomprimiendo el contenido podemos ver los archivos que lo conforman:

El archivo box.ovf es la configuración de la maquina virtual en este formato que nos permite exportar imagenes de maquinas virtuales, es un estandard abierto para empaquetar y distribuirlas.

El archivo box-disk2.vmdk es el archivo del disco duro de nuestra maquina virtual, es importante usar este formato a pesar de que hay otros como VHD.

El archivo metadata.json es un archivo que define el proveedor con el cual trabajará nuestra imagen, en este caso es Virtualbox.

El archivo Vagrantfile como lo vimos anteriormente en este se crearán las configuraciones para nuestra imagen, pero en este caso solo contiene información básica como la dirección mac de la tarjeta de red de nuestra máquina virtual, y al inicializar una nueva imagen este será reemplazado por el que usamos para configurar nuestra imagen de trabajo.

Iniciando - Creando la imagen en Virtualbox

Lo primero que haremos es descargar la ISO que querramos usar de base para crear nuestra imagen, en este ejemplo use la imagen de Debian 9.3.0 Netinstall, estos pasos se pueden realizar en cualquier SO.
Abrimos Virtualbox y comenzamos por crear una nueva maquina virtual:

Y para la memoria RAM base podemos asignar 512MB, esto es base, siempre podremos asignar mas en nuestro Vagrantfile.

Seleccionamos un nuevo disco duro de tamaño dinamico:

Y en el siguiente paso seleccionamos el formato del disco duro que como mencioné antes es importante elegir el formato VMDK

Continuamos y una vez creada la maquina virtual, en las opciones de la maquina virtual recien creada, iremos al apartado de Audio y lo deshabilitaremos (esto es porque no se usa el audio generalmente)

Instalación de SO

La instalación de Debian la omitiré ya que no es el objetivo de este post, ademas de ser bastante sencilla, solo comentaré que es una instalación básica, con solo las herramientas básicas y el servidor SSH, sin un entorno gráfico.
Ademas cuando creemos el usuario para nuestra maquina virtual, por convención Vagrant usa el usuario "vagrant" con contraseña "vagrant" asi como la contraseña de root es "vagrant", esto es importante ya que la primera vez que iniciamos nuestra imagen esta se loguea para hacer algunos ajustes.

Configuración de SO

Una vez instalado nuestro Debian, nos loguearemos a este con el usuario root, aquí podemos(DEBEMOS) actualizar e instalar algunas herramientas que querramos incluir por default en nuestra imagen.

Ademas configuraremos sudo para nuestro usuario vagrant, ya que vagrant necesita ejecutar algunos comandos con privilegios de administrador y sin requerir contraseña. Para esto podemos editar nuestro archivo sudoers y agregar la siguiente linea:

# User privilege specification
root    ALL=(ALL:ALL) ALL
vagrant ALL=(ALL) NOPASSWD:ALL

NOTA: en Debian 9 > por default no se usa VIM o Nano para modificar este archivo, se usa otro editor llamado Joe, no lo habia usado hasta entonces...
Para cambiar a VI o NANO ejecutamos:

$ EDITOR=nano visudo

Instalando llave SSH

Para nuestro usuario vagrant, necesitaremos instalar la llave para conectarnos por SSH para trabajar, la primera vez que se inicia nuestra imagen usa una llave SSH "generica" vagrant detecta esta llave y genera una nueva y segura.
Para instalarla primero creamos el directorio ".ssh" en nuestro home de vagrant, descargamos la llave y la guardamos como el archivo "authorized_keys", después cambiamos los permisos de nuestro directorio y archivo:

# 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

Virtualbox Guest Additions ISO

Este es un paso recomendado, para este proveedor que es Virtualbox, lo mejor es instalar las herramientas para la maquina virtual (para compartir directorios, entre otras cosas), para esto instalaremos el paquete de las cabeceras del kernel, necesario para instalar los modulos del kernel, en Debian ejecutamos:

# apt install -y build-essential gcc linux-headers-amd64

una vez instalado esto, instalamos las herramientas de Virtualbox, para hacerlo, una vez iniciada nuetra maquina virtual en el menú de Dispositivos, al final seleccionamos la opción de Insertar ISO de Guest Additions, esto cargará la ISO y la montamos:

# mount /dev/cdrom /mnt
# cd /mnt
# ./VBoxLinuxAdditions.run

Una vez actualizado, instalado y configurado, borraremos el espacio libre de nuestro disco duro:

# dd if=/dev/zero of=/EMPTY bs=1M
# rm -rf /EMPTY

NOTA: este paso puede demorar un poco, esto es para una mejor compresión al momento de empaquetar la imagen.

Empaquetar nuestra imagen

Una vez terminado de configurar nuestro SO, vamos al paso de empaquetar nuestra imagen, esto lo haremos desde la terminal de nuestro equipo, primero nos posicionaremos en un directorio donde guardaremos nuestra imagen empaquetada:

$ cd /home/miusuario/vagrantboxes/debian9/
$ vagrant package --base debian9.3.0 --output debian9.3.0x64.box 

donde el parametro:

Subiendo nuestra imagen a Vagrant Cloud

Una vez empaquetada nuestra imagen podemos alojarla en Vagrant Cloud, para ello nos crearemos una cuenta en Vagrant Cloud, una vez creada nuestra cuenta, en el Dashboard daremos click en el botón "New Vagrant Box"

y comenzaremos con el wizard:

Donde pondremos el nombre a nuestro box y definimos la visibilidad de esta (solo puede ser privada si la cuenta es de pago), además pondremos una descripción corta para esta, y daremos click en "Create box".

aqui especificaremos la versión de nuestra imagen y la descripción de esta, y daremos click en "Create version"

Una vez creada la versión nos mostrará el dashboard y la versión recien creada:

Y daremos click en el botón "Add provider" y nos mostrará lo siguiente:

Donde seleccionaremos el proveedor, en este caso virtualbox y definimos que cargaremos una imagen "Upload to Vagrant Cloud:

Seleccionamos nuestro archivo box empaquetado previamente y comenzará la carga.

Una vez terminada la carga regresamos al dashboard y vemos que en nuestra versión creada está el proveedor que cargamos y podemos liberar la versión dando click en el botón "Release..."

Una vez liberadá podremos comenzar a usarla y compartirla con nuestros compañeros.