Caso práctico de uso de vagrant

Para este ejemplo levantaremos un sistema linux (ubuntu) con apache como ejemplo del uso de vagrant.

##Pre-Requisitos Instalar VirtualBox Descargar VirtualBox vagrant soporta las versiones 4.0.x y 4.1.x

##Instalando Vagrant Descargar el paquete adecuado para su sistema operativo Descargar Vagrant e instalarlo.

##Probando la instalación Abrir una terminal y ejecutar :

$ vagrant
Usage: vagrant -v -h command <args>

    -v, --version                    Print the version and exit.
    -h, --help                       Print this help.
  ...
$ vagrant --version
Vagrant version 1.0.3

##Descargando una máquina base (Base Box) Vagrant funciona a base de máquinas base que son distribuciones de cualquier sistema operativo ligeramente modificadas para que vagrant pueda ejecutarse en ellas, normalmente instalar ruby, chef.

$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box

Lo que hace este comando es agregar una máquina base, es decir el archivo vmdk (el disco duro de la máquina de virtual box) junto con otros archivos de configuración a un directorio general: $HOME/.vagrant.d/boxes

La idea es que a partir de este se pueden crear muchos ambientes usando el mismo archivo descargado. Como en el ejemplo se descarga un ubuntu lucid de 32 bits, al crear otra máquina virtual con vagrant, esta no se modifica solo se copia y se inicia la instalación de paquetes, de esta forma si algo va mal se puede destruir la máquina virtual y volver a regenerarla sin problemas y sin descargar nuevamente la máquina base.

##Creando la primera máquina virtual Los ambientes virtuales normalmente estan atados a un proyecto específico en el que se este trabajando, por lo cual el siguiente comando debe ejecutarse dentro del directorio del proyecto.

$ vagrant init lucid32

Este comando creará un archivo Vagrantfile en el cual esta la configuración de la máquina por ejemplo:

##Iniciando el ambiente virtual Este comando toma la configuración del proyecto en Vagrantfile e inicia una máquina virtual en virtual box, y la provisiona dependiendo del sistema usado, en este momento no lo hemos definido todavía y solo iniciará la máquina sin ningún paquete extra instalado.

$ vagrant up
[default] Importing base box 'lucid32'...
Guest Additions Version: 4.1.0
VirtualBox Version: 4.1.4
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- v-root: /vagrant

Ok la máquina está levantada y ejecutándose para ingresar podemos hacer ssh a esta:

$ vagrant ssh
Linux lucid32 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.04.3 LTS

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Thu Jul 21 13:07:53 2011 from 10.0.2.2
vagrant@lucid32:~$ 

##Provisionando la nueva máquina Una vez que la máquina se esta ejecutando no tiene nada instalado, por lo que ahora lo que se requiere hacer es definir la forma en la que deseamos instalar el software base necesario, recordemos que la idea de usar vagrant es que podemos utilizar la misma receta en diferentes ambientes de desarrollo obteniendo siempre los mismos resultados.

Para este caso usaremos chef-solo

Chef permite escribir las recetas de instalación de paquetes usando un DSL escrito en ruby.

Para activar chef, abrimos Vagrantfile y agregamos al final antes del último end lo siguiente:

  # Enable and configure the chef solo provisioner
  config.vm.provision :chef_solo do |chef|
    # En este caso descargamos nuestro libro de recetas desde el web
	  # hay otras opciones para mantener las recetas dentro del proyecto
    chef.recipe_url = "http://files.vagrantup.com/getting_started/cookbooks.tar.gz"

    # Ejecuta la receta vagrant_main
    # la cual hace toda la magia
    chef.add_recipe("vagrant_main")
  end

Y para ejecutar esta receta se necesita lanzar el comando:

$ vagrant provision
[default] Running provisioner: Vagrant::Provisioners::ChefSolo...
[default] Generating chef JSON and uploading...
[default] Running chef-solo...
stdin: is not a tty
[Mon, 28 May 2012 16:09:24 -0700] INFO: *** Chef 0.10.2 ***
[Mon, 28 May 2012 16:09:25 -0700] INFO: Setting the run_list to ["recipe[vagrant_main]"] from JSON
[Mon, 28 May 2012 16:09:25 -0700] INFO: Run List is [recipe[vagrant_main]]
[Mon, 28 May 2012 16:09:25 -0700] INFO: Run List expands to [vagrant_main]
[Mon, 28 May 2012 16:09:25 -0700] INFO: Starting Chef Run for lucid32
[Mon, 28 May 2012 16:09:25 -0700] INFO: Processing execute[apt-get update] action run (apt::default line 20)
[Mon, 28 May 2012 16:09:25 -0700] INFO: execute[apt-get update] sh(apt-get update)
...
[Mon, 28 May 2012 16:16:15 -0700] INFO: Processing service[apache2] action restart (apache2::default line 189)
[Mon, 28 May 2012 16:16:17 -0700] INFO: service[apache2] restarted
[Mon, 28 May 2012 16:16:17 -0700] INFO: Chef Run complete in 411.460964 seconds
[Mon, 28 May 2012 16:16:17 -0700] INFO: Running report handlers
[Mon, 28 May 2012 16:16:17 -0700] INFO: Report handlers complete

##Redireccionar un puerto interno

Para poder acceder desde afuera del ambiente debemos modificar los puertos redireccionados.

Para lo cual editamos Vagrantfile

  # Agregar esto cerca de la configuraci&oacute;n de puertos comentada
  config.vm.forward_port 80, 4567

Para hacer que se tome en cuenta este nuevo puerto se debe recargar la máquina

$ vagrant reload
[default] Attempting graceful shutdown of VM...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 80 => 4567 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.

##Crear un archivo index.html para ver que está funcionando

Abrir tu editor favorito y colocar lo siguiente:

<h1>Hello from a Vagrant VM</h1>

Ir al navegador y abrir localhost:4567

Debe poder ver lo siguiente:

Pagina web funcionando en vagrant

Eso es todo

Si necesitan ayuda en algun punto que no lo trate con mucha explicación no duden en escribir en los comentarios.