Entornos de desarrollo con Vagrant

¿Qué es Vagrant? Cómo Instalar y Configurar Vagrant

Vagrant es una herramienta para la creación y configuración de entornos de desarrollo virtualizados. Originalmente se desarrolló para VirtualBox y sistemas de configuración tales como Chef, Salt y Puppet. Sin embargo desde la versión 1.1 Vagrant es capaz de trabajar con múltiples proveedores de infraestructura como servicio “IaaS”.

Esta es un pequeña guía en base a nuestra experiencia utilizando Vagrant, una documentación más extensa se puede consultar en la web oficial.

Es importante dimensionar los recursos y proporcionalidad en la VM ‘Guest’ local para que coincida a lo que vamos a contratar en un servidor remoto, lo adecuado es asignar igual o menos recursos en el entorno local sobre los que tenemos disponibles en remoto. Actualmente hemos invertido la potencia de hardware para entornos Cliente/Servidor; hace una década lo que solíamos contratar en un CPD era infinitamente más potente que los recursos que disponíamos en nuestro ordenador de sobremesa. Con la llegada del consumo de servidores virtualizados (VPS) esa tendencia se ha invertido, ahora se racionaliza y democratiza mucho más el consumo de recursos.

Es habitual ver a desarrolladores intentando desplegar una aplicación web que han probado en un equipo local con 4–8GB de RAM (o más) en un servidor compartido o en un servidor VPS de tan sólo 1GB. La primera reacción es quejarse de que en local va bien y el mismo código va lento en el servidor VPS. Parece obvio… dicha aplicación no funcionará fluida en remoto por falta de recursos, la solución es optimizar el código o contratar la misma cantidad de recursos en remoto que en nuestra máquina virtual Vagrant para desarrollo.

Instalación de paquetes en Host y concepto BOX

Lo primero que haremos en el sistema operativo anfitrión, en mi caso Ubuntu 14.04 LTS, es instalar el paquete de Vagrant.

root@nessys-tp-e540:~# aptitude install vagrant

Cuando ya tenemos instalado Vagrant lo primero que conceptualmente tendremos que tener claro es que al conjunto del Sistema Operativo + Aplicaciones en Vagrant se le llama BOX . La magia de todo esto radica en que con muy poco esfuerzo vamos a poder desplegar un entorno para desarrollo con unas características determinadas, replicarlo y compartirlo. Análogamente en LXC se llama Docker o en VMWare se llaman appliances.

Este es el listado oficial de ‘Vagrant Boxes’
 https://vagrantcloud.com/discover/featured

Primer Proyecto

Lo que pretendemos conseguir es tener un entorno idéntico tanto en el Servidor remoto como el entorno local para nuestros desarrollos. Con lo que si en el Servidor tenemos una Ubuntu Server 14.04 la cajita (‘box’) que voy a bajar e instalar es:

Ubuntu 14.04 Trusty Tahr with LAMP stack and Puppet, se puede descargar de aquí, pero debemos hacerlo con los siguientes comandos:

Preparamos el entorno en local:

paco@nessys-tp-e540:~$ cd "VirtualBox VMs"/
paco@nessys-tp-e540:~/VirtualBox VMs$ mkdir vagrant_ubuntu1404_lamp
paco@nessys-tp-e540:~/VirtualBox VMs$ cd vagrant_ubuntu1404_lamp/

Lo que acabo de hacer es ir al directorio de VirtualBox, dentro he creado un directorio para el proyecto… de este modo tengo todas las VM en la misma ubicación. Ahora hay que bajar el Vagrant Box e inicializarlo.

Para utilizar las boxes disponibles, esta es la sintaxi:

$ vagrant box add {title} {url} 
$ vagrant init {title}
$ vagrant up

Por tanto, ahora:
 (nos aseguramos que vamos a descargar la versión para VirtualBox)

paco@nessys-tp-e540:~/VirtualBox VMs/vagrant_ubuntu1404_lamp$ vagrant box add ubuntu1404_lamp https://vagrantcloud.com/xplore/boxes/ubuntu-14.04/versions/3/providers/virtualbox.box
Downloading box from URL: https://vagrantcloud.com/xplore/boxes/ubuntu-14.04/versions/3/providers/virtualbox.box
Extracting box...te: 2435k/s, Estimated time remaining: --:--:--)
Successfully added box 'ubuntu1404_lamp' with provider 'virtualbox'!

Ahora inicializamos el box:

paco@nessys-tp-e540:~/VirtualBox VMs/vagrant_ubuntu1404_lamp$ vagrant init ubuntu1404_lamp
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Levantamos el entorno:

paco@nessys-tp-e540:~/VirtualBox VMs/vagrant_ubuntu1404_lamp$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'ubuntu1404_lamp'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Mounting shared folders...
[default] -- /vagrant

Gestionando Vagrant, algunos ajustes

Según podemos ver la máquina ya la tenemos listada y corriendo sobre VirtualBOX

Según la documentación del creador de este box, la máquina viene con el siguiente software pre-instalado:

Ubuntu 14.04 Trusty Tahr AMD64

Apache 2.4.7
 mod_rewrite
 PHP 5.5.9–1ubuntu4
 php5-mysql
 php5-curl
 php5-gd
 php5-xdebug
 php-pear
 php5-mcrypt
 php5-tidy
 MariaDB 5.5.36
 phpMyAdmin 4.0.10deb1
 Git 1.9.1
 Puppet 3.4.3

Lo cual sólo me obliga a sustituir MariaDB por MySQL para que el nuevo entorno de desarrollo (local) coincida con el de producción (remoto)

Aunque si nos fijamos con la captura anterior la máquina se ha construido con sólo 384MB de RAM: de modo que voy a hacer unos ajustes manuales con la asignación de memoria RAM. Entonces paramos la máquina de este modo:

paco@nessys-tp-e540:~/VirtualBox VMs/vagrant_ubuntu1404_lamp$ vagrant halt 
[default] Attempting graceful shutdown of VM...

Ya con la VM ajustada a 1024MB de RAM, momento de conocer los comandos…

Interactuar con Vagrant mediante CLI

Con Vagrant podremos gestionar el entorno mediante un conjunto de comandos que podremos consultar en https://docs.vagrantup.com/v2/cli/index.html o directamente mostrarlos con ‘vagrant –help’, y son estos:

Available subcommands:
box manages boxes: installation, removal, etc.
destroy stops and deletes all traces of the vagrant machine
halt stops the vagrant machine
help shows the help for a subcommand
init initializes a new Vagrant environment by creating a Vagrantfile
package packages a running vagrant environment into a box
plugin manages plugins: install, uninstall, update, etc.
provision provisions the vagrant machine
reload restarts vagrant machine, loads new Vagrantfile configuration
resume resume a suspended vagrant machine
ssh connects to machine via SSH
ssh-config outputs OpenSSH valid configuration to connect to the machine
status outputs status of the vagrant machine
suspend suspends the machine
up starts and provisions the vagrant environment

Se me ocurre por ejemplo ejecutar #vagrant ssh-config para ver la configuración y así poder conectarme con mi cliente SSH preferido.

paco@nessys-tp-e540:~/VirtualBox VMs/vagrant_ubuntu1404_lamp$ ssh vagrant@192.168.1.13
The authenticity of host '192.168.1.13 (192.168.1.13)' can't be established.
ECDSA key fingerprint is 98:95:c2:61:73:4d:e2:52:fc:8b:bf:06:c7:c6:f3:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.13' (ECDSA) to the list of known hosts.
vagrant@192.168.1.13's password:
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-24-generic x86_64)

¿Qué hace especial a Vagrant? Características

Además de ser una herramienta muy rápida para el despliegue de entorno de desarrollo/pre-producción tiene un gran potencial por características como estas:

  • Despliegue rápido de entornos
  • Gestión mediante CLI
  • Destruir entornos rápidamente cuando no se necesitan
  • Probar nuevos entornos empaquetados por otros
  • Empaquetar nuestros propios entornos
  • Distribuir y compartir entornos
  • Integración con Chef, Salt, Puppet, …
  • Despliegue de entornos en Cloud Público “IaaS”
  • Extender funcionalidades mediante Plugins

También podremos bajar boxes desde sitios no oficiales como Github o vagrantbox.es

Esperamos os haya gustado este pequeño post de introducción a Vagrant.


Originally published at www.nessys.es.

Show your support

Clapping shows how much you appreciated NESSYS IT’s story.