Post on 19-Jun-2015
VAGRANTVIRTUALIZANDO ENTORNOS
DE DESARROLLO
Daniel Viguerasdaniel@scalia.es@danielvigueras
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
ESCENARIO 1Desarrollador 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
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
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
¡ Usar máquinas virtuales para cada entorno de desarrollo !
SOLUCIÓN
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
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 !! »
Vagrant: virtualizando entornos de desarrollo / Daniel Vigueras / @danielvigueras
OBTENER VAGRANTDescargar 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
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
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 initA `Vagrantfile` has been placed in this directory. You are nowready to `vagrant up` your first virtual environment! Please readthe 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
INICIO RÁPIDO (III)Accediendo por SSH
$ vagrant sshLinux lucid32 2.6.32-‐38-‐generic #83-‐Ubuntu SMP Wed Jan 4 11:13:04 UTC 2012 i686 GNU/LinuxUbuntu 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.2vagrant@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:Linkvagrant@lucid32:~$ ping -‐c 1 www.google.esPING 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 0msrtt min/avg/max/mdev = 85.038/85.038/85.038/0.000 ms
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 destroyAre 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
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
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
AUTOMATIZACIÓN (II)
Declarativo
Clases y módulos
Maduro (2005)
Extendido
Imperativo (ruby)
Recetas
Más reciente (2009)
Menos extendido
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" endend
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"]}
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],}
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