Introducción
Para un trabajo estoy usando Vagrant. Es una herramienta interesante, ya que permite realizar un deploy de maquinas virtuales (VMs) con relativa facilidad.
Pero me costo un poco la curva inicial, tuve que leer bastante porque utiliza ciertos conceptos que parecen “nuevos” aunque luego son cosas conocidas una vez que se lee la documentación, la que por cierto, esta muy completa, pero en Ingles.
La intención con este post, es dar mi introducción corta a esta herramienta, y remitir a otros posts y documentación que me sirvió para entender como funciona.
Muchas de las ideas acá expuestas surgieron de la lectura de la trilogía de Posts de Erika Heidi.
La idea detrás de Vagrant es automatizar la construcción y despliegue (deploy) de Maquinas virtuales que serán utilizadas para tareas similares o idénticas.
Un caso posible es un entorno de desarrollo, donde cada nuevo desarrollador debería instalar el sistema en base al software necesario para programar, teniendo en cuenta las versiones y configuraciones particulares de los mismos. En su lugar, se podría crear un repositorio con las configuraciones para Vagrant, entonces el desarrollador en cuestión se descargaría un par de archivos de textos, y mediante una cantidad mínima de comandos tendría una VM con la configuración lista para comenzar a desarrollar.
El siguiente Mapa Conceptual muestra a grandes rasgos los conceptos relacionados con Vagrant.
Como se observa, Vagrant actúa como “pegamento” de otras tecnologías previamente existentes, y las integra en un único comando con diversas opciones.
Conceptos
Vamos a explicar alguno de los conceptos que aparecen en el mapa conceptual:
Providers: Nombre que asigna Vagrant a los Hypervisores o Software para gestionar VMs. Por defecto utiliza Virtualbox. En el caso de VMware, según entiendo, ademas de la licencia propia de este, hay que pagar una licencia por el plugin de Vagrant para utilizarlo.
Box: Es una instalación de un sistema operativo concreto, en un archivo que Vagrant utiliza. Es normal que diferentes desarrolladores de SO o personas independientes publiquen sus Boxes en internet, para poder descargarnos un entorno ya instalado y pre-configurado. Algunos ejemplos acá, acá y acá.
Provisioning: Tiene nombre parecido a Providers, pero son ideas diferentes. Un provisioning es un software para automatizar tareas en una VM. Es independiente y previo a Vagrant, aunque este utiliza dicho Software para alcanzar el objetivo de crear documentos de actualización, control y mantenimiento de las Boxes.
Vagrantfile
Una box de vagrant puede ser replicada cuantas veces se desee, y las diferencias entre cada entorno se establecen a través de un archivo por cada “instalación” que se llama Vagrantfile.
El archivo es en realidad un script en Ruby, que es leído por el comando vagrant para realizar las diferentes acciones.
Para tener una VM con vagrant, alcanza con tener una carpeta y un archivo Vagrantfile con la configuración adecuada.
En Internet hay muchos proyectos para extraer ejemplos, acá agrego una configuración posible:
Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.network :private_network, ip: "192.168.33.101" config.vm.synced_folder "./", "/vagrant" end
Teniendo el archivo anterior, y haciendo vagrant up en la carpeta, comenzara a descargar la box si es que no la tiene previamente descargada, creara una red privada entre el host y el guest, y montara una carpeta compartida entre ambos para poder intercambiar datos. En el Vagrantfile anterior, descarga un Ubuntu 12.04 (Precise) de 64 bits.
Una referencia mas exhaustiva de configuraciones las pueden encontrar en la documentación oficial del proyecto.
Algunos tips
Paquetes
Por algun motivo, es mejor descargar Vagrant desde la pagina oficial, y no instalarlo desde los repositorios. En lo personal, también puedo hacer la misma recomendación respecto de Virtualbox. Con paquetes desactualizados suelen ocurrir problemas no convencionales (Por ejemplo, al instalar las Guests Additions puede fallar a veces).
vagrant init o vagrant up
En esta introducción yo sugiero crear un archivo Vagrantfile, y luego hacer vagrant up para instalar la VM. En otros lugares encontraran que en su lugar, se puede usar el comando init sin necesidad de crear el Vagrantfile. No hay una forma correcta y otra incorrecta. En el caso de usar init, Vagrant creara un Vagrantfile por default con las configuraciones mínimas necesarias para que funcione la VM. En el caso de usar up, el archivo Vagrantfile debe existir.
stdin: is not a tty
Si el mensaje
stdin: is not a tty
Aparece cuando se esta iniciando una VM, no se hagan problema (no es un error), pero si quieren solucionarlo, dentro de la VM hagan lo siguiente:
sed -i 's/^mesg n$/tty -s \&\& mesg n/g' /root/.profile
Cuando se inicie nuevamente la VM, el mensaje no aparecerá nuevamente.
Problemas con acceso ssh automático
Por diferentes motivos, puede ocurrir que se pierda el acceso vía ssh a la VM. En mi caso, me encontraba haciendo pruebas de logueo automático en diferentes VMs y borre accidentalmente la carpeta ~/.ssh del usuario vagrant (La que usa el comando para mágicamente loguearnos cuando hacemos vagrant ssh).
En estos casos, lo mejor es iniciar la VM con la GUI predeterminada (Por ejemplo, a traves de Virtualbox), loguearse con el usuario vagrant de forma normal, y allí dentro ejecutar el script postinstall.sh con sudo. Luego de eso, reiniciar la VM, y el acceso estará restablecido.
La realidad es que parece una pavada, pero no encontré en foros o listas sobre esto (se que es un error muy pavo, pero me pasó), y estuve un rato para encontrar el script en cuestión.
Fuentes y recursos
http://www.erikaheidi.com/blog/a-begginers-guide-to-vagrant-getting-your-portable-development-e
http://www.erikaheidi.com/blog/a-beginners-guide-to-vagrant-part-2-provisioning-and-puppet
http://www.erikaheidi.com/blog/a-beginners-guide-to-vagrant-and-puppet-part-3-facts-conditional