entornos de desarrollo para symfony2 con vagrant y puppet

53

Upload: vicent-soria-dura

Post on 22-Nov-2014

3.577 views

Category:

Technology


0 download

DESCRIPTION

Si hay algo tedioso, y repetitivo, al empezar un proyecto con Symfony 2, es preparar el entorno. En los equipos de desarrollo a veces nos encontramos con problemas con los sistemas operativos, y las versiones de las librerías que cada uno tiene instaladas en su máquina, además de lo pesado que es preparar todo lo necesario en una nueva máquina, por ejemplo, para el nuevo desarrollador que entra en el equipo. Gracias a Vagrant y Puppet, podemos preparar una configuración común para nuestros proyectos replicable en todos los ordenadores de nuestro equipo de desarrollo, ¡¡incluso en los servidores de pre-producción y producción!! Cada desarrollador puede trabajar en su sistema operativo favorito, con su IDE favorito, y Vagrant hará el resto. En la primera parte de la charla, haremos una introducción a la problemática de los entornos de desarrollo con Symfony 2, comentando cuales son los pasos para preparar nuestro entorno antes de poder instalar y empezar a trabajar con el framework. También hablaremos del problema con el que a veces nos encontramos al subir código a nuestro servidor, y encontrarnos con que no funciona: ¡¡Pero si en mi máquina va perfecto!! En la última parte, veremos un caso práctico de como configurar Vagrant con Puppet para tener un entorno completo para Symfony en nuestros equipos de desarrollo.

TRANSCRIPT

Page 1: Entornos de desarrollo para symfony2 con vagrant y puppet
Page 2: Entornos de desarrollo para symfony2 con vagrant y puppet
Page 3: Entornos de desarrollo para symfony2 con vagrant y puppet

ALGO SOBRE MIVICENT SORIA DURÁ

Desarrollador Web (en Symfony 2)

Trabajo en Social Point como Automation Engineer

Page 4: Entornos de desarrollo para symfony2 con vagrant y puppet

ÍNDICE1. Introducción2. ¿Qué es Vagrant?3. ¿Qué es Puppet?4. ¿Problemas?5. ¿Cómo lo uso en mis proyectos?

Page 5: Entornos de desarrollo para symfony2 con vagrant y puppet

INTRODUCCIÓN¿Qué hacemos para preparar un nuevo ordenador?

Page 6: Entornos de desarrollo para symfony2 con vagrant y puppet

SISTEMA OPERATIVO¿Qué pasa si yo uso Linux y mi compañero MAC?

Ubuntu: Apt-getRedHat: YumMac: ¿MAMP? ¿Zend Studio? ¿Macports? ¿Homebrew?Windows: ¿WAMP? ¿caos?

Page 7: Entornos de desarrollo para symfony2 con vagrant y puppet

IDEPHPStormSublime Text 2NetbeansEclipse + PDTVi / Emacs

Page 8: Entornos de desarrollo para symfony2 con vagrant y puppet

PREPARAR EL PROYECTOClonamos el repositorioConfiguramos virtual hostInstalamos vendorsCreamos BBDDPersonalizamos parameters.yml

Page 9: Entornos de desarrollo para symfony2 con vagrant y puppet

PUESTA EN PRODUCCIÓN (O PRE-PRODUCCION)

¿Problemas?

¡Si en mi máquina funciona!

Page 10: Entornos de desarrollo para symfony2 con vagrant y puppet

PUESTA EN PRODUCCIÓN (O PRE-PRODUCCION)

OBSERVACIONES

Diferente sistema operativo.¿Qué versión de PHP tienes? ¿Y en producción?¿Qué versión del servidor de BBDD? ¿Y en producción?¿Y de ese paquete para aquel vendor que usamos?Los tests en local están todos en verde

Page 11: Entornos de desarrollo para symfony2 con vagrant y puppet

SOLUCIONESMismo S.O. para todosMismos paquetes instaladosMisma configuración en todos los entornos

Page 12: Entornos de desarrollo para symfony2 con vagrant y puppet

SOLUCIONES¡Pero yo uso Mac!

¡Y yo Linux!

¡Y yo windows!

Page 13: Entornos de desarrollo para symfony2 con vagrant y puppet
Page 14: Entornos de desarrollo para symfony2 con vagrant y puppet

SOLUCIONESDisponemos de herramientas que nos ayudarán:

Vagrant (Virtualización)Puppet o Chef (Aprovisionamiento y configuración)

Page 15: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTVagrant provides easy to configure,

reproducible, and portable workenvironments built on top of industry-

standard technology and controlled by asingle consistent workflow to help maximize

the productivity and flexibility of you andyour team.

Page 16: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANT¿Qué es?

Herramienta de virtualizaciónPermite crear y configurar entornos de desarrolloportables, ligeros y reproducibles

Page 17: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTPermite utilizar diversos proveedores

VirtualBoxVMware (De pago)Amazon Web ServicesLos nuestros propios

Page 18: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTREQUISITOS

Virtual Box: Vagrant:

https://www.virtualbox.org/http://www.vagrantup.com/

Page 19: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANT¿CÓMO SE USA?

OTRAS IMÁGENES

http://www.vagrantbox.es

$ vagrant init precise64 http://files.vagrantup.com/precise64.box$ vagrant up

Page 20: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTCOMANDOS DISPONIBLES

vagrant up - Arranca la máquinavagrant halt - Para la máquinavagrant status - Muestra el estadovagrant destroy - Elimina la máquina virtualvagrant ssh - Conecta por ssh

Page 21: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTVAGRANTFILE

Vagrant.configure("2") do |config| config.vm.box = "precise64"

config.vm.box_url = "http://files.vagrantup.com/precise64.box"end

Page 22: Entornos de desarrollo para symfony2 con vagrant y puppet

VAGRANTCONFIGURACIÓN

Vagrantfile

Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box"

config.vm.network :private_network, ip: "192.168.33.10" config.vm.network :forwarded_port, guest: 80, host: 8080 config.vm.provider :virtualbox do |vb| # Don't boot with headless mode vb.gui = true # Use VBoxManage to customize the VM. vb.customize ["modifyvm", :id, "--cpus", "2"] vb.customize ["modifyvm", :id, "--memory", "1024"] endend

Page 23: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETExisten varias herramientas de automatización para la

configuración de sistemas

Scripts de shellChef (Solo y Client)Puppet (Apply y Agent)

Page 24: Entornos de desarrollo para symfony2 con vagrant y puppet

SCRIPTS DE SHELLVENTAJAS

Cualquier Unix lo trae por defectoCualquier Sysadmin lo controla

INCONVENIENTES

Difícil de mantener cuando creceTodo "a pelo"Difícil de probar

Page 25: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPET / CHEFVENTAJAS

Documentación"Librerías" ya hechas (módulos/cookbooks)Fácil de probar

INCONVENIENTES

Aprendizaje

Page 26: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPET¿QUÉ ES?

Herramienta de gestión de configuración para servidoresDefine estados de recursosConfigura una vez, ejecútalo 1000 veces

Page 27: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETTERMINOLOGÍA

Manifests: DefinicionesModules: "Bundles"TemplatesFacter: Información sobre S.O. (y sistema)Hiera: "DB"

Page 28: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETMANIFESTS

/examples/file-1.pp

file {'testfile': path => '/tmp/testfile', ensure => present, mode => 0640, content => "I'm a test file.",}

Page 29: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETMANIFESTS

/manifests/default.pp

class base { include mysql include php include apache}

include base# óclass { 'base' }

Page 30: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETMODULES

/puppet/ manifests/ default.pp modules/ apache/ manifests/ # Manifest in the module init.pp files/ # Static files templates/ vhost.erb lib/ # plugins, custom facts, custom resource types tests/ # Example manifests examples/ # Example manifests spec/ # Test with rspec-puppet

Page 31: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETMODULES

/modules/apache/manifests/init.ppclass apache::install { package { 'apache2': ensure => installed, }}class apache::run { service { apache2: enable => true, ensure => running, hasstatus => true, hasrestart => true, require => Class['apache::install'], }}class apache { include apache::install include apache::run}

Page 32: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETTEMPLATES

/modules/apache/templates/vhost.erb

<Directory /vagrant/web> Options Indexes FollowSymLinks MultiViews

AllowOverride None Order allow,deny allow from all

RewriteEngine On RewriteBase /<%= project_name %>/web RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ̂(.*)$ app.php [QSA,L] DirectoryIndex app.php</Directory>

Page 33: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETTEMPLATES

/modules/apache/manifests/init.pp

$sitesavailable = '/etc/apache2/sites-available' $sitesenabled = '/etc/apache2/sites-enabled'

file { "$sitesavailable/$project_name": content => template('apache/dev.erb'), owner => 'root', group => 'root', mode => '755', } -> file { "$sitesenabled/$project_name": require => File["$sitesavailable/$project_name"], ensure => 'link', target => "$sitesavailable/$project_name", notify => Service['apache2'], }

Page 34: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETFACTER

architecture => i386...ipaddress => 172.16.182.129is_virtual => truekernel => Linuxkernelmajversion => 2.6...operatingsystem => CentOSoperatingsystemrelease => 5.5physicalprocessorcount => 0processor0 => Intel(R) Core(TM)2 Duo CPU P8800 @ 2.66GHzprocessorcount => 1productname => VMware Virtual Platform

Page 35: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETHIERA

# /etc/puppet/hieradata/appservers.yaml---proxies: - hostname: lb01.example.com ipaddress: 192.168.22.21 - hostname: lb02.example.com ipaddress: 192.168.22.28

# Get the structured data:$proxies = hiera('proxies')# Index into the structure:$use_ip = $proxies[1]['ipaddress'] # will be 192.168.22.28

Page 36: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETCOMO AGENTE

Page 37: Entornos de desarrollo para symfony2 con vagrant y puppet

PUPPETCOMO AGENTE/MAESTRO

Page 38: Entornos de desarrollo para symfony2 con vagrant y puppet
Page 39: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?COSAS A TENER EN CUENTA

DependenciasLas clases son singletonsRendimiento

Page 40: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?DEPENDENCIAS

class base { Class['system::resolv'] -> Class['apache'] -> Class['php'] -> Apache::Vhost['dev']

include system::resolv include apache include php

apache::vhost {'dev': project_name => $project_name }}

include base

Page 41: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?CLASES SON SINGLETONS

class apache::vhost { ...}apache::vhost {'users.example.com': port => 80, docroot => '/var/www/personal',}apache::vhost {'groups.example.com': } ### FAIL###################define apache::vhost( $port = 80) { ...}apache::vhost {'testhost': port => 8081,}

Page 42: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?RENDIMIENTO

SYMFONY TIENE + 9000 ARCHIVOS

It’s a long known issue that VirtualBox sharedfolder performance degrades quickly as the

number of files in the shared folder increases.As a project reaches 1000+ files, doing simple

things like running unit tests or even justrunning an app server can be many orders ofmagnitude slower than on a native filesystem

(e.g. from 5 seconds to over 5 minutes).

Page 43: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?RENDIMIENTO

Usar NFS mientras sea posible (Requiere permisos de root)

SO SoporteMac Sí (instalado por defecto)Linux (Ubuntu) Sí (sudo apt-get install nfs-kernel-server)Windows No

Page 44: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?RENDIMIENTO

VagrantfileVagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box"

... config.vm.synced_folder ".", "/vagrant", :nfs => true ...end

Page 45: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PROBLEMAS?RENDIMIENTO

Desactivar Swap exec { 'disable-swap': path => '/sbin', command => 'swapoff -a', user => 'root',}

Page 46: Entornos de desarrollo para symfony2 con vagrant y puppet

¿CÓMO LO USO EN MIS PROYECTOS?

VALE, ME HAS CONVENCIDO, ¿Y AHORA CÓMO LO USO?

Page 47: Entornos de desarrollo para symfony2 con vagrant y puppet

¿CÓMO LO USO EN MIS PROYECTOS?

(Casi) Listo para usarMódulos completosÚtil en proyectos empezados

HTTPS://PUPHPET.COM

Page 48: Entornos de desarrollo para symfony2 con vagrant y puppet

¿CÓMO LO USO EN MIS PROYECTOS?PROYECTOS NUEVOS

https://github.com/vicentgodella/symfony2-vagrant-skeleton

git clone [email protected]:vicentgodella/symfony2-vagrant-skeleton.git

composer install

# Añadir al '/etc/hosts':127.0.0.1 sf2-vagrant.dev

Cargar la url 'http://sf2-vagrant.dev:8080/app_dev.php' en el navegador.

Page 49: Entornos de desarrollo para symfony2 con vagrant y puppet

DEMO

Page 51: Entornos de desarrollo para symfony2 con vagrant y puppet

¿PREGUNTAS?

[email protected]

@vicentgodellahttps://joind.in/8846

Page 52: Entornos de desarrollo para symfony2 con vagrant y puppet
Page 53: Entornos de desarrollo para symfony2 con vagrant y puppet