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:
- Cuál es el box base, y su url
- Qué tipo de interfaz de red usa y cual IP usar
- Puertos redirigidos (forward ports) para acceder a puertos dentro del ambiente virtual
- Directorios compartidos (por defecto siempre se comparte /vagrant dentro del ambiente a la máquina host en el directorio donde se encuentra el Vagrantfile
- El tipo de provisionador (puppet, chef o propio) esto es el sistema que se usará para instalar los paquetes
##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ó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:
Eso es todo
Si necesitan ayuda en algun punto que no lo trate con mucha explicación no duden en escribir en los comentarios.