Slide 1

Slide 1 text

VAGRANT VIRTUALIZANDO ENTORNOS DE DESARROLLO Daniel Vigueras daniel@scalia.es @danielvigueras

Slide 2

Slide 2 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras ESCENARIO 1 Desarrollador de varios proyectos con diferentes entornos conflictivos entre sí Ruby 1.8 Rails 1.2 MySQL 4.1 PHP 5.3 Vevui MongoDB 2.2 PHP 5.2 CodeIgniter MySQL 5.0 Ruby 1.9 Rails 3.2 MySQL 5.5

Slide 3

Slide 3 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras Equipo de desarrollo con diferentes sistemas operativos XAMP, WAMP, MAMP, LAMP, Apache, Nginx... Instalar librerías y servicios (Memcached, Redis, MongoDB, Sphinx...) ESCENARIO 2

Slide 4

Slide 4 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras ¡ Usar máquinas virtuales para cada entorno de desarrollo ! SOLUCIÓN

Slide 5

Slide 5 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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 ?

Slide 6

Slide 6 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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 ?

Slide 7

Slide 7 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 8

Slide 8 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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 SOLUCIÓN: VAGRANT

Slide 9

Slide 9 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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 SOLUCIÓN: VAGRANT « ¡¡ En mi ordenador funciona !! »

Slide 10

Slide 10 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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)

Slide 11

Slide 11 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras INICIO RÁPIDO (I)

Slide 12

Slide 12 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras INICIO RÁPIDO (I) Añadir una primera imagen como base

Slide 13

Slide 13 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras INICIO RÁPIDO (I) Añadir una primera imagen como base $  vagrant  box  add  base  http://files.vagrantup.com/lucid32.box

Slide 14

Slide 14 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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 )

Slide 15

Slide 15 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 16

Slide 16 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras INICIO RÁPIDO (I) Añadir una primera imagen como base Iniciar máquina virtual $  vagrant  box  add  base  http://files.vagrantup.com/lucid32.box Crear fichero de configuración inicial ( Vagrantfile ) $  vagrant  init

Slide 17

Slide 17 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras INICIO RÁPIDO (I) Añadir una primera imagen como base Iniciar máquina virtual $  vagrant  box  add  base  http://files.vagrantup.com/lucid32.box Crear fichero de configuración inicial ( Vagrantfile ) $  vagrant  init $  vagrant  up

Slide 18

Slide 18 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 19

Slide 19 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 20

Slide 20 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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...

Slide 21

Slide 21 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 22

Slide 22 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 23

Slide 23 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 24

Slide 24 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras AUTOMATIZACIÓN (II) Declarativo Clases y módulos Maduro (2005) Extendido Imperativo (ruby) Recetas Más reciente (2009) Menos extendido

Slide 25

Slide 25 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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

Slide 26

Slide 26 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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"] }

Slide 27

Slide 27 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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], }

Slide 28

Slide 28 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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... RESUMEN

Slide 29

Slide 29 text

Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras 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... RESUMEN