En otro artículo mostraba cómo montar un entorno de desarrollo para recetas Chef usando Vagrant y, en mi caso, VirtualBox como sistema de virtualización local.

En este caso mostraré cómo Vagrant y otra herramienta llamada Veewee resuelven el siguiente problema: la necesidad de montar una máquina virtual con una versión tan antigua o rara de un sistema operativo que no existan imágenes virtuales Vagrant para ella. Por ejemplo: Ubuntu Hardy (8.04 LTS), ya sin soporte oficial…

Veewee es una herramienta que permite, entre otras cosas, crear máquinas virtuales Vagrant desde máquinas ya existentes VirtualBox. Y esto es lo que es útil para el problema que planteo arriba. No es un proceso muy complicado el que detallo a continuación, y simplemente requiere: VirtualBox, Veewee y una imagen ISO de, en este caso, Ubuntu Hardy.

Instalación de Veewee

Primero Ruby con RVM:

$ \curl -L https://get.rvm.io | bash
$ rvm install 1.9.2
$ git clone https://github.com/jedi4ever/veewee.git
$ cd veewee
$ rvm use 1.9.2@veewee --create
$ gem install bundler
$ bundle install

Creación de la máquina virtual

Veewee trae varias plantillas de máquinas, con lo que el proceso es muy sencillo, por ejemplo, para crear una máquina llamada web:

$ bundle exec veewee vbox templates | grep -i ubuntu
$ bundle exec veewee vbox define 'web' 'ubuntu-8.04.4-server-amd64'
$ bundle exec veewee vbox build 'web' --workdir=/Users/javier/Documents/workspace/veewee

La dura realidad: no funciona para Ubuntu 8.04

Es la verdad, el proceso no funciona. Básicamente hace lo siguiente:

  • Cuando define la máquina usando la plantilla, crea una nueva plantilla copia de la original. Esta plantilla está formada por tres ficheros:
    • postinstall.sh: Guión para preparar la máquina virtual y dejarla lista para su uso en Vagrant. Por ejemplo, en el caso de una máquina basada en VirtualBox instala las herramientas de invitado (VBoxGuestAdditions), pero también realiza tareas propias del entorno Vagrant como crear la pareja de claves RSA para la conexión SSH (vagrant ssh) y otras.
    • definition.rb, propio de Veewee para crear la máquina, que en el caso de VirtualBox establece las características de la máquina virtual (memoria, CPU) e incluso la URL de descarga de la imagen ISO.
    • preseed.cfg se usa en el instalador de Ubuntu (debian installer) y establece las opciones por defecto en una instalación automatizada.
  • Al construir la máquina se lanza VirtualBox (se puede ver la máquina arrancando en modo gráfico) y la instalación continua de forma automatizada. Bajando un poco a los detalles, Veewee inyecta pulsaciones de teclado de forma que se carga una imagen de Linux por red (servidor local lanzado por el propio Veewee) y se inicia una instalación automatizada definida en preseed.cfg, seguida de postinstall.sh

Y hasta aquí puedo leer, porque es en este punto donde la instalación falla: el asistente de instalación (debian-installer) que se ve gráficamente en la máquina de VirtualBox, no pasa del punto “instalar paquetes”. Y falla simplemente porque la ISO de Hardy trae como ruta de los repositorios la URL archive.ubuntu.com cuando ahora es old-releases.ubuntu.com… #fail

Workaround

Veewee permite modificar la plantilla que se usará para la creación de una máquina, así que el problema se soluciona editando el fichero preseed.cfg y estableciendo el repositorio de paquetes old-releases.ubuntu.com:

# debconf-get-selections --install
#Use mirror
d-i apt-setup/use_mirror boolean true
d-i     mirror/country          string manual
choose-mirror-bin mirror/protocol       string http
choose-mirror-bin mirror/http/hostname  string old-releases.ubuntu.com
choose-mirror-bin mirror/http/directory string /ubuntu 
choose-mirror-bin mirror/suite  select hardy
d-i debian-installer/allow_unauthenticated      string true

Con este sencillo cambio la instalación de Ubuntu 8.04 termina y el proceso automatizado de veewee continua sin problemas. Lo he subido a un fork de github, supongo que algún día lo llevarán al master del proyecto y ya está mezclado en el proyecto oficial.

Para terminar: validar la imagen y exportarla:

$ bundle exec veewee vbox validate 'web'
$ bundle exec veewee vbox export 'web

Terminando

Veewee es una buena herramienta que permite crear máquinas virtuales Vagrant (en mi caso VirtualBox) para requisitos que no se cumplen con las máquinas disponibles en Internet o el propio Vagrant.

En mi caso, una máquina Ubuntu 8.04 (x64 server), que además requiere cambios en el propio Veewee por la antiguedad de la misma.

El resultado es un fichero box de Vagrant que contiene la máquina y que se puede usa como base para crear máquinas virtuales:

$ vagrant box add 'web' '/Users/javier/Documents/workspace/veewee/web.box'
$ vagrant init 'web'
$ vagrant up
$ vagrant ssh