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
- 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...
- Ahora inicializamos la máquina virtual
macnolo-pro:vagrant tocandotecla$ vagrant init ttlucid32
create Vagrantfile
Con esto simplemente hemos creado el archivoVagrantfile, 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
-
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?
-
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
-
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
-
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