La magia de Vagrant

Vagrant es una herramienta con la que me he topado últimamente mirando herramientas de atomatización relacionadas con el provisionamiento de entornos.

La idea de Vagrant es facilitar al máximo la creación de máquinas virtuales VirtualBox fácilmente distribuibles. Además se integra con Puppet y Chef. Con estas herramientas podemos construir un entorno virtual totalmente configurado para nuestras necesidades, empaquetarlo y distribuirlo. Este entorno puede, inmediatamente, ser arrancado y posteriormente destruido sin dejar rastro en el disco; tambien podemos suspenderlo y pararlo.

La web del proyecto es http://vagrantup.com y la documentación es muy buena, no como la de otros productos OpenSource.

Nuestra máquina virtual

Vamos a crearnos una máquina virtual que utilizaremos para cacharrear con distintas herramientas. Para ello partiremos de una máquina virtual base a la que vamos a instalarle puppet y luego la reempaquetaremos

Lo primero que necesitamos es tener instalado VirtualBox, que es un software gratuito de virtualización proporcionado por Oracle. Es importante resaltar que Vagrant necesita la versión 4.1.0 de VirtualBox o superior. La instalación de VirtualBox es trivial y no es el objetivo de este post.

Además para instalar Vagrant necesitamos tener instalado el software en que se basa: el lenguaje de programación Ruby y RubyGems, ya que Vagrant se distribuye como una gema. Tampoco vamos a hablar aquí de cómo instalar ruby y rubygems.

Instalación de vagrant

macnolo-pro:~ tocandotecla$ sudo gem install vagrant
Fetching: archive-tar-minitar-0.5.2.gem (100%)
Fetching: erubis-2.7.0.gem (100%)
Fetching: net-ssh-2.1.4.gem (100%)
Fetching: net-scp-1.0.4.gem (100%)
Fetching: i18n-0.6.0.gem (100%)
Successfully installed archive-tar-minitar-0.5.2
Successfully installed erubis-2.7.0
Successfully installed net-ssh-2.1.4
Successfully installed net-scp-1.0.4
Successfully installed i18n-0.6.0
Successfully installed vagrant-0.8.10
6 gems installed
Installing ri documentation for archive-tar-minitar-0.5.2...
Installing ri documentation for erubis-2.7.0...
Installing ri documentation for net-ssh-2.1.4...
Installing ri documentation for net-scp-1.0.4...
Installing ri documentation for i18n-0.6.0...
Installing ri documentation for vagrant-0.8.10...
Installing RDoc documentation for archive-tar-minitar-0.5.2...
Installing RDoc documentation for erubis-2.7.0...
Installing RDoc documentation for net-ssh-2.1.4...
Installing RDoc documentation for net-scp-1.0.4...
Installing RDoc documentation for i18n-0.6.0...
Installing RDoc documentation for vagrant-0.8.10...

(el usuario con el que estoy trabajando no tiene todos los permisos, por eso me veo obligado a hacer sudo)
Con esto ya tenemos instalado vagrant

Creación de nuestra máquina virtual

  1. Lo primero nos bajamos una máquina virtual de las que ya están empaquetadas, que nos servirá como base (ver enlaces al final del post). A esta máquina virtual la voy a llamar ttlucid32
    macnolo-pro:~ tocandotecla$ vagrant box add ttlucid32 http://files.vagrantup.com/lucid32.box
    [vagrant] Downloading with Vagrant::Downloaders::HTTP...
    [vagrant] Downloading box: http://files.vagrantup.com/lucid32.box
    [vagrant] Extracting box...
    [vagrant] Verifying box...
    [vagrant] Cleaning up downloaded box...
    


  2. Ahora inicializamos la máquina virtual

    macnolo-pro:vagrant tocandotecla$ vagrant init ttlucid32
    create Vagrantfile

    Con esto simplemente hemos creado el archivo Vagrantfile, que es el archivo de configuración de Vagrant para la máquina virtual que estamos creando. Este archivo tiene muchos comentarios con ejemplos de lo que podemos hacer pero si los eliminamos queda simplemente un trozo de código ruby que configura la máquina virtual con el nombre que le hemos puesto en el comando init (que debería coincidir con el que indicamos en el paso 1 al descargar la VM)

    Vagrant::Config.run do |config|
      # Every Vagrant virtual environment requires a box to build off of.
      config.vm.box = "ttlucid32"
    end
    
  3. En este momento ya tenemos descargada una máquina virtual base y un archivo de configuración que informa a vagrant de su nombre. Esta información es suficiente para arrancar la máquina virtual. Para ello lo único que tenemos que hacer es invocar vagrant up desde el directorio donde está el archivo Vagrantfile

    [default] Importing base box 'ttlucid32'...
    [default] The guest additions on this VM do not match the install version of
    VirtualBox! This may cause things such as forwarded ports, shared
    folders, and more to not work properly. If any of those things fail on
    this machine, please update the guest additions and repackage the
    box.
    
    Guest Additions Version: 4.1.0
    VirtualBox Version: 4.1.8
    [default] Matching MAC address for NAT networking...
    [default] Clearing any previously set forwarded ports...
    [default] Forwarding ports...
    [default] -- ssh: 22 => 2222 (adapter 1)
    [default] Creating shared folders metadata...
    [default] Running any VM customizations...
    [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
    

    Vale, ha arrancado, ¿y ahora qué hacemos con ella? ¿Cómo nos conectamos?

  4. Para conectarnos a la máquina virtual debemos invocar el comando vagrant ssh, que nos abre una conexión ssh a la máquina utilizando el usuario vagrant

    macnolo-pro:vagrant tocandotecla$ 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:~$
    vagrant@lucid32:~$ who am i
    vagrant  pts/0        2011-12-30 09:22 (10.0.2.2)
    vagrant@lucid32:~$ uname -a
    Linux lucid32 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux
    
  5. Además nuestro directorio de partida en nuestra máquina, se ha convertido en una carpeta compartida en la máquina virtual, accesible en el directorio /vagrant

    vagrant@lucid32:~$ cd /vagrant
    vagrant@lucid32:/vagrant$ ls
    Vagrantfile
    
  6. El objetivo de nuestra máquina virtual es probar puppet y chef, que son softwares de provisionamiento, es decir instaladores con esteroides. La máquina virtual descargada ya trae instalados ambos, así que simplemente vamos a instalar apache. Esto se puede hacer desde el propio archivo Vagrantfile utilizando puppet o chef pero como aún no hemos trasteado con estas herramientas lo vamos a hacer por el método tradicional desde la propia máquina virtual

    vagrant@lucid32:~$ sudo apt-get install apache2
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following extra packages will be installed:
      apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    Suggested packages:
      apache2-doc apache2-suexec apache2-suexec-custom
    The following NEW packages will be installed:
      apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
    0 upgraded, 10 newly installed, 0 to remove and 38 not upgraded.
    Need to get 3,086kB/3,352kB of archives.
    After this operation, 10.3MB of additional disk space will be used.
    Do you want to continue [Y/n]? Y
    Get:1 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2.2-bin 2.2.14-5ubuntu8.7 [2,631kB]
    Get:2 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2-utils 2.2.14-5ubuntu8.7 [160kB]
    Get:3 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2.2-common 2.2.14-5ubuntu8.7 [291kB]
    Get:4 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2-mpm-worker 2.2.14-5ubuntu8.7 [2,374B]
    Get:5 http://us.archive.ubuntu.com/ubuntu/ lucid-updates/main apache2 2.2.14-5ubuntu8.7 [1,486B]
    Fetched 3,086kB in 2s (1,248kB/s)
    .............
    Setting up apache2-mpm-worker (2.2.14-5ubuntu8.7) ...
     * Starting web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
       ...done.
    
    Setting up apache2 (2.2.14-5ubuntu8.7) ...
    
    Setting up ssl-cert (1.0.23ubuntu2) ...
    
    Processing triggers for libc-bin ...
    ldconfig deferred processing now taking place
    vagrant@lucid32:~$
    

Empaquetando la máquina virtual

Empaquetar la máquina virtual es tan sencillo como ejecutar vagrant package

macnolo-pro:vagrant tocandotecla$ vagrant package
[default] Attempting graceful shutdown of linux...
[default] Clearing any previously set forwarded ports...
[default] Cleaning previously set shared folders...
[default] Creating temporary directory for export...
[default] Exporting VM...
Progress: 0%Progress: 14%Progress: 28%Progress: 31%Progress: 34%Progress: 36%Progress: 46%Progress: 57%Progress: 68%Progress: 74%Progress: 83%Progress: 86%Progress: 93%[default] Compressing package to: /Users/tocandotecla/vagrant/package.box

Nuestra nueva máquina está empaquetada como package.box, la renombramos a devops.box, ya que la vamos a utilizar para probar herramientas de devops

macnolo-pro:vagrant tocandotecla$ mv package.box devops.box

Entre bambalinas

  • ¿Dónde se descargan las máquinas virtuales? En mi máquina Mac todo se descarga a un directorio oculto en la raíz del usuario.vagrant.d

Enlaces relacionados

Colección de VM Vagrant ya preparadas
Virtual Box

Video de demo

Aquí dejo un video que da una idea bastante buena de lo que es capaz de hacer Vagrant

Vagrant – Getting Started from Mitchell Hashimoto on Vimeo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *