Entorno de desarrollo con Vagrant

Para evitar el clásico problema de que el entorno de producción de tu aplicación no es igual al de desarrollo y esto cause errores has de utilizar entornos de desarrollo virtualizados. Para encargarte de esto puedes utilizar Vagrant, que es una herramienta que facilita esto y hará que desinstales WAMP, XAMP o MAMP.

¿Por qué Vagrant?

Mediante un archivo de configuración Vagrant levanta una maquina virtual con todas las necesidades y que por ejemplo, todo el equipo de desarrollo trabaje con la misma versión de PHP, evitando problemas de downgrades, o simplemente que OSX viene con PHP 5.4, Ubuntu 5.5  y Debian con otra más antigua.

Además, es muy fácil levantar un server utilizando Apache2 o NGinx o el que quieras y que todos utilicen el mismo. Y o mejor de todo, que en el servidor de producción puedas levantar exactamente (si, exactamente) la misma máquina.

La configuración de Vagrant incluso puede estar en el control de Versiones, permitiendo hacer cambios en el entorno UNA ÚNICA vez y verlos reflejados en todos los entornos de trabajo. Por ejemplo, necesitamos un software específico para una nueva funcionalidad (muchas veces php5-curl no está instalado), entonces podemos crear un script que realice estas acciones al iniciar la máquina, entonces esta instalación se propagará a todas las Máquinas Virtuales del equipo de desarrollo.

Puesta a punto

Vamos a ver como configurar un entorno de desarrollo con Vagrant en nuestro ordenador. Para esto, lo primero que has de hacer es instalar 2 componentes esenciales: VirtualBox (puedes elegir otras opciones como VMware, etc.) y el propio Vagrant.

Para instalar VirtualBox, ve a su web y descárgalo para tu Sistema Operativo, luego para instalar Vagrant ve a su web y escoge también tu Sistema Operativo.

Una vez instalados los componentes, abrimos la terminal y creamos un directorio donde trabajar

$ cd -- #vamos al directorio home
$ mkdir vardump-vagrant #creamos un directorio de trabajo
$ cd vardump-vagrant #entramos
$ vagrant init #con este comando creamos el archivo de configuración Vagrant

Ahora falta que le agreguemos una máquina virtual (una box). Por suerte no tenemos que crearla nosotros con VirtualBox, sino que existe un listado con distribuciones de sistemas operativos de donde elegir aquí, elegimos una distribución y corremos el comando:

# vagrant box add [nombre]
$ vagrant box add ubuntu/trusty64 

Tener en cuenta de descargar una box para VirtualBox y pasamos a modificar el archivo de configuración de Vagrant para que utilice la máquina virtual que hemos descargado, buscando la configuración y cambiando/agregando estas opciones:

 
    #utilizar la máquina virtual descargada
    config.vm.box = "ubuntu_server_14_04" 
    #configurar red para redirigir el puerto 8888 de tu pc al puerto 80 de la máquina virtual.
    config.vm.network :forwarded_port, host: 8888, guest: 80

 

Como trabajar

Una vez tenemos configurado todo, podemos comenzar a trabajar con Vagrant mediante sus comandos:

$ vagrant up 
# Para levantar la maquina virtual, para arrancarla.

$ vagrant ssh 
# Para entrar a la maquina virtual por SSH.

$ vagrant halt
# Para parar la maquina virtual.

$ vagrant suspend 
# Para pausar la maquina virtual pero dejando copia en disco para arrancarla más rápido.

$ vagrant resume
# Para volver a arrancar la máquina virtual despues de haber suspendido.

$ vagrant status
# Para saber en que estado está la máquina virtual.

$ vagrant destroy
# Para eliminarla.

 

Scripts de arranque

La máquina virtual vendrá pelada, por lo que tendremos que instalarle cosas antes de utilizarla. Si probamos ahora mismo, veremos que en http://localhost:8888 no hay nada, esto es porque no hay un servidor instalado. Ejemplificaremos instalando Apache2.

En la configuración de Vagrant editamos y colocamos esto:

 
    config.vm.provision "shell", inline: <<-SHELL
     apt-get update
     apt-get install -y apache2
  SHELL

De esta manera al realizar un vagrant up se ejecutará el script bash deseado que en este caso actualiza los paquetes y luego instala apache2 suponiendo SI a todas las preguntas del instalador.

Se pueden colocar multiples comandos para preparar el entorno. Es esencial colocar todos los scripts que se hayan de ejecutar porque de esta manera mantendrá consistencia para todos los desarrolladores del proyecto, lo que hará que todas las máquinas virtuales estén igual.

Os dejo el Vagrantfile de ejemplo:

 

 
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  config.vm.box = "ubuntu/xenial64"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network :forwarded_port, host: 8888, guest: 80

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
  # such as FTP and Heroku are also available. See the documentation at
  # https://docs.vagrantup.com/v2/push/atlas.html for more information.
  # config.push.define "atlas" do |push|
  #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
  # end

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install apache2 -y
  SHELL
end
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on StumbleUpon
Pablo Oneto

Soy un desarrollador de software web especializado en PHP.

4 Comments

  1. Pingback: El futuro de los entornos de desarrollo con Vagrant

  2. José Olivares

    Hola pablo, muy buena la info, bien detalla y fácil de seguir, pero tengo una duda, al tratar de iniciar vagrant “vagrant init” me aparece el siguiente error en la terminal

    C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:252:in `mkdir’: Invalid argument @ dir_s_mkdir – C:/Users/Jos? (Errno::EINVAL)
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:252:in `fu_mkdir’
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:226:in `block (2 levels) in mkdir_p’
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:224:in `reverse_each’
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:224:in `block in mkdir_p’
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:210:in `each’
    from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/fileutils.rb:210:in `mkdir_p’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/lib/vagrant/environment.rb:777:in `block in setup_home_path’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/lib/vagrant/environment.rb:772:in `each’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/lib/vagrant/environment.rb:772:in `setup_home_path’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/lib/vagrant/environment.rb:129:in `initialize’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/bin/vagrant:165:in `new’
    from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.6/bin/vagrant:165:in `’

    podrías ayudarme por favor

    1. Pablo Oneto
      Pablo Oneto

      Hola José, no acostumbro trabajar en windows, pero deberías poder correr Vagrant sin problemas. Quizás sea porque el directorio donde está la máquina contiene caracteres latinos (José), prueba mover tu directorio de trabajo a algo así: “C:\proyecto” a ver si te funciona. Saludos y gracias por pasar por el blog.

  3. jorge villegas

    Hola amigo gracias por el aporte, actualmente estoy trabajando en un proyecto con java 8 uso eclipse como IDE, PostgreSQL como Base de dato y ireport como re porteador, es posible meter todo esto en un contenedor junto a las fuentes de mi código??

    1. Pablo Oneto
      Pablo Oneto

      Esto depende como hagas los deploys de java. No es mi campo, pero si por ejemplo deployas WARs, tienes que entender el vagrant como un servidor web, entonces sincronizar el directorio de salida de los wars con un directorio en el vagrant y cada vez que hagas un build, el tomcat (u otro) dentro del vagrant ya percibirá el cambio y hará el deploy. Has de guardar el VagrantFile (si tienes algún script de inicio de vagrant también) con tu código fuente y solo eso ya que las VMs ocupan mucho y vagrant las puede volver a crear con el VagrantFile.

Deja un comentario