El documento describe cómo Vagrant permite virtualizar entornos de desarrollo de manera sencilla. Vagrant permite crear, iniciar, detener y eliminar máquinas virtuales de forma fácil sin importar el proveedor de virtualización subyacente. El documento muestra los pasos básicos para configurar un entorno de desarrollo virtualizado con Vagrant en menos de 3 oraciones.
2. ESCENARIO 1
Desarrollador de varios proyectos con diferentes entornos conflictivos
entre sí
Ruby 1.8 PHP 5.2 Ruby 1.9 PHP 5.3
Rails 1.2 CodeIgniter Rails 3.2 Vevui
MySQL 4.1 MySQL 5.0 MySQL 5.5 MongoDB 2.2
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
3. ESCENARIO 2
Equipo de desarrollo con diferentes sistemas operativos
XAMP, WAMP, MAMP, LAMP, Apache, Nginx...
Instalar librerías y servicios (Memcached, Redis, MongoDB, Sphinx...)
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
4. SOLUCIÓN
¡ Usar máquinas virtuales para cada entorno de desarrollo !
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
5. PROBLEMAS
¿Qué entorno de virtualización elijo?
¿VMWare? ¿VirtualBox? ¿KVM? ¿Xen?
¿Cómo creo una máquina virtual?
Me da pereza instalar un nuevo sistema operativo...
¿Cómo comparto el entorno con otras personas?
¿Y si quiero cambiar de entorno de virtualización ?
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
6. PROBLEMAS
¿Qué entorno de virtualización elijo?
¿VMWare? ¿VirtualBox? ¿KVM? ¿Xen?
¿Cómo creo una máquina virtual?
Me da pereza instalar un nuevo sistema operativo...
¿Cómo comparto el entorno con otras personas?
¿Y si quiero cambiar de entorno de virtualización ?
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
7. PROBLEMAS
¿Qué entorno de virtualización elijo?
¿VMWare? ¿VirtualBox? ¿KVM? ¿Xen?
¿Cómo creo una máquina virtual?
Me da pereza instalar un nuevo sistema operativo...
¿Cómo comparto el entorno con otras personas?
¿Y si quiero cambiar de entorno de virtualización ?
Usar herramienta independiente del entorno de virtualización que nos
oculte los detalles
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
8. SOLUCIÓN: VAGRANT
Crear, iniciar, detener y eliminar VMs de manera sencilla
Escrito en ruby
Open source ( http://github.com/mitchellh/vagrant )
Actualmente sólo es capaz de controlar Oracle VM VirtualBox
En el futuro soportará cualquier entorno mediante plugins
Está siendo usado por varias empresas importantes
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
9. SOLUCIÓN: VAGRANT
Crear, iniciar, detener y eliminar VMs de manera sencilla
Escrito en ruby
Open source ( http://github.com/mitchellh/vagrant )
Actualmente sólo es capaz de controlar Oracle VM VirtualBox
En el futuro soportará cualquier entorno mediante plugins
Está siendo usado por varias empresas importantes
« ¡¡ En mi ordenador funciona !! »
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
10. OBTENER VAGRANT
Descargar e instalar Oracle VM VirtualBox de http://www.virtualbox.org (Última versión 4.2)
Descargar e instalar Vagrant de http://vagrantup.com (Última versión 1.0.4)
Mac (DMG), Linux (DEB, RPM), Windows (MSI)
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
11. INICIO RÁPIDO (I)
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
12. INICIO RÁPIDO (I)
Añadir una primera imagen como base
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
13. INICIO RÁPIDO (I)
Añadir una primera imagen como base
$
vagrant
box
add
base
http://files.vagrantup.com/lucid32.box
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
14. INICIO RÁPIDO (I)
Añadir una primera imagen como base
$
vagrant
box
add
base
http://files.vagrantup.com/lucid32.box
Crear fichero de configuración inicial ( Vagrantfile )
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
15. INICIO RÁPIDO (I)
Añadir una primera imagen como base
$
vagrant
box
add
base
http://files.vagrantup.com/lucid32.box
Crear fichero de configuración inicial ( Vagrantfile )
$
vagrant
init
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
16. INICIO RÁPIDO (I)
Añadir una primera imagen como base
$
vagrant
box
add
base
http://files.vagrantup.com/lucid32.box
Crear fichero de configuración inicial ( Vagrantfile )
$
vagrant
init
Iniciar máquina virtual
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
17. INICIO RÁPIDO (I)
Añadir una primera imagen como base
$
vagrant
box
add
base
http://files.vagrantup.com/lucid32.box
Crear fichero de configuración inicial ( Vagrantfile )
$
vagrant
init
Iniciar máquina virtual
$
vagrant
up
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
18. INICIO RÁPIDO (II)
Resultado de ejecución
$
vagrant
box
add
base
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...
$
vagrant
init
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.
$
vagrant
up
[default]
VM
already
created.
Booting
if
it's
not
already
running...
[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
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
19. INICIO RÁPIDO (III)
Accediendo por SSH
$
vagrant
ssh
Linux
lucid32
2.6.32-‐38-‐generic
#83-‐Ubuntu
SMP
Wed
Jan
4
11:13:04
UTC
2012
i686
GNU/Linux
Ubuntu
10.04.4
LTS
Welcome
to
Ubuntu!
*
Documentation:
https://help.ubuntu.com/
New
release
'precise'
available.
Run
'do-‐release-‐upgrade'
to
upgrade
to
it.
Welcome
to
your
Vagrant-‐built
virtual
machine.
Last
login:
Fri
Sep
14
07:26:29
2012
from
10.0.2.2
vagrant@lucid32:~$
ifconfig
eth0|grep
inet
inet
addr:10.0.2.15
Bcast:10.0.2.255
Mask:255.255.255.0
inet6
addr:
fe80::a00:27ff:feb5:756c/64
Scope:Link
vagrant@lucid32:~$
ping
-‐c
1
www.google.es
PING
www.google.es
(173.194.34.216)
56(84)
bytes
of
data.
64
bytes
from
mad01s08-‐in-‐f24.1e100.net
(173.194.34.216):
icmp_seq=1
ttl=63
time=85.0
ms
-‐-‐-‐
www.google.es
ping
statistics
-‐-‐-‐
1
packets
transmitted,
1
received,
0%
packet
loss,
time
0ms
rtt
min/avg/max/mdev
=
85.038/85.038/85.038/0.000
ms
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
20. INICIO RÁPIDO (IV)
Suspender, despertar, detener y destruir la VM
$
vagrant
suspend
[default]
Saving
VM
state
and
suspending
execution...
$
vagrant
resume
[default]
Resuming
suspended
VM...
[default]
Booting
VM...
[default]
Waiting
for
VM
to
boot.
This
can
take
a
few
minutes.
[default]
VM
booted
and
ready
for
use!
$
vagrant
halt
[default]
Attempting
graceful
shutdown
of
VM...
$
vagrant
destroy
Are
you
sure
you
want
to
destroy
the
'default'
VM?
[Y/N]
Y
[default]
Destroying
VM
and
associated
drives...
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
21. CONFIGURACIÓN
Elementos importantes del fichero Vagrantfile
Vagrant::Config.run
do
|config|
#
Alias
local
de
la
VM
base
config.vm.box
=
"base"
#
URL
de
dónde
descargar
la
VM
en
caso
de
no
tenerla
config.vm.box_url
=
"http://files.vagrantup.com/lucid32.box"
#
Tipo
de
arranque
(Podría
ser
:gui)
config.vm.boot_mode
=
:headless
#
Modo
de
red
(Podría
ser
:bridged)
config.vm.network
:hostonly,
"192.168.33.10"
#
Redirigir
puerto
8000
en
host
hacia
el
puerto
80
en
VM
config.vm.forward_port
80,
8000
#
Directorio
compartido
config.vm.share_folder("v-‐root",
"/vagrant",
".")
end
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
22. AUTOMATIZACIÓN (I)
Una VM vacía no nos sirve de mucho
Para empezar un proyecto necesitamos ciertas herramientas
A mitad del proyecto es muy probable que necesitemos más
Es necesario automatizar la instalación y configuración de software
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
23. AUTOMATIZACIÓN (I)
Una VM vacía no nos sirve de mucho
Para empezar un proyecto necesitamos ciertas herramientas
A mitad del proyecto es muy probable que necesitemos más
Es necesario automatizar la instalación y configuración de software
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
24. AUTOMATIZACIÓN (II)
Declarativo Imperativo (ruby)
Clases y módulos Recetas
Maduro (2005) Más reciente (2009)
Extendido Menos extendido
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
25. EJEMPLO CON PUPPET (I)
Vagrant::Config.run
do
|config|
#
Alias
local
de
la
VM
base
config.vm.box
=
"base"
#
URL
de
dónde
descargar
la
VM
en
caso
de
no
tenerla
config.vm.box_url
=
"http://files.vagrantup.com/lucid32.box"
#
Modo
de
red
(Podría
ser
:bridged)
config.vm.network
:hostonly,
"192.168.33.10"
#
Directorio
compartido
config.vm.share_folder("v-‐root",
"/vagrant",
".")
#
Usar
puppet/ejemplo.pp
como
fichero
de
manifiesto
puppet
config.vm.provision
:puppet
do
|puppet|
puppet.manifests_path
=
"puppet"
puppet.manifest_file
=
"ejemplo.pp"
end
end
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
26. EJEMPLO CON PUPPET (II)
Contenido de puppet/ejemplo.pp
exec
{"apt-‐get-‐update":"apt-‐get-‐update":
creates
=>
"/tmp/apt-‐get-‐updated",
command
=>
"/usr/bin/apt-‐get
update
&&
/usr/bin/touch
/tmp/apt-‐
get-‐updated"
}
package
{"apache2":
ensure
=>
present,
require
=>
Exec["apt-‐get-‐update"],
}
$php
=
["php5-‐cli",
"php5-‐mysql",
"libapache2-‐mod-‐php5"]
package
{
$php:
ensure
=>
present,
notify
=>
Service["apache2"],
require
=>
Exec["apt-‐get-‐update"]
}
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
27. EJEMPLO CON PUPPET (III)
Agregando soporte a MySQL
$mysql
=
["mysql-‐server",
"mysql-‐client"]
package
{
$mysql:
ensure
=>
present,
require
=>
Exec["apt-‐get-‐update"]
}
file
{"/etc/mysql/my.cnf":
ensure
=>
file,
owner
=>
"root",
group
=>
"root",
mode
=>
644,
source
=>
"/vagrant/puppet/files/mysql/my.cnf",
require
=>
Package[$mysql],
notify
=>
Service["mysql"],
}
service
{"mysql":
enable
=>
true,
ensure
=>
running,
require
=>
Package[$mysql],
}
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
28. RESUMEN
Vagrant es una herramienta muy potente
Réplica en desarrollo del entorno de producción
Si aún no la usas estás perdiendo tiempo y dinero...
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
29. RESUMEN
Vagrant es una herramienta muy potente
Réplica en desarrollo del entorno de producción
Si aún no la usas estás perdiendo tiempo y dinero...
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras