Entornos de desarrollo para symfony2 con vagrant y puppet

5,137 views

Published on

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.

Published in: Technology

Entornos de desarrollo para symfony2 con vagrant y puppet

  1. 1. ALGO SOBRE MIVICENT SORIA DURÁDesarrollador Web (en Symfony 2)Trabajo en Social Point como Automation Engineer
  2. 2. ÍNDICE1. Introducción2. ¿Qué es Vagrant?3. ¿Qué es Puppet?4. ¿Problemas?5. ¿Cómo lo uso en mis proyectos?
  3. 3. INTRODUCCIÓN¿Qué hacemos para preparar un nuevo ordenador?
  4. 4. 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?
  5. 5. IDEPHPStormSublime Text 2NetbeansEclipse + PDTVi / Emacs
  6. 6. PREPARAR EL PROYECTOClonamos el repositorioConfiguramos virtual hostInstalamos vendorsCreamos BBDDPersonalizamos parameters.yml
  7. 7. PUESTA EN PRODUCCIÓN (O PRE-PRODUCCION)¿Problemas?¡Si en mi máquina funciona!
  8. 8. PUESTA EN PRODUCCIÓN (O PRE-PRODUCCION)OBSERVACIONESDiferente 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
  9. 9. SOLUCIONESMismo S.O. para todosMismos paquetes instaladosMisma configuración en todos los entornos
  10. 10. SOLUCIONES¡Pero yo uso Mac!¡Y yo Linux!¡Y yo windows!
  11. 11. SOLUCIONESDisponemos de herramientas que nos ayudarán:Vagrant (Virtualización)Puppet o Chef (Aprovisionamiento y configuración)
  12. 12. VAGRANTVagrant provides easy to configure,reproducible, and portable workenvironments built on top of industry-standard technology and controlled by asingle consistent workflow to help maximizethe productivity and flexibility of you andyour team.
  13. 13. VAGRANT¿Qué es?Herramienta de virtualizaciónPermite crear y configurar entornos de desarrolloportables, ligeros y reproducibles
  14. 14. VAGRANTPermite utilizar diversos proveedoresVirtualBoxVMware (De pago)Amazon Web ServicesLos nuestros propios
  15. 15. VAGRANTREQUISITOSVirtual Box:Vagrant:https://www.virtualbox.org/http://www.vagrantup.com/
  16. 16. VAGRANT¿CÓMO SE USA?OTRAS IMÁGENEShttp://www.vagrantbox.es$ vagrant init precise64 http://files.vagrantup.com/precise64.box$ vagrant up
  17. 17. VAGRANTCOMANDOS DISPONIBLESvagrant up - Arranca la máquinavagrant halt - Para la máquinavagrant status - Muestra el estadovagrant destroy - Elimina la máquina virtualvagrant ssh - Conecta por ssh
  18. 18. VAGRANTVAGRANTFILEVagrant.configure("2") do |config|config.vm.box = "precise64"config.vm.box_url = "http://files.vagrantup.com/precise64.box"end
  19. 19. VAGRANTCONFIGURACIÓNVagrantfileVagrant.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: 8080config.vm.provider :virtualbox do |vb|# Dont boot with headless modevb.gui = true# Use VBoxManage to customize the VM.vb.customize ["modifyvm", :id, "--cpus", "2"]vb.customize ["modifyvm", :id, "--memory", "1024"]endend
  20. 20. PUPPETExisten varias herramientas de automatización para laconfiguración de sistemasScripts de shellChef (Solo y Client)Puppet (Apply y Agent)
  21. 21. SCRIPTS DE SHELLVENTAJASCualquier Unix lo trae por defectoCualquier Sysadmin lo controlaINCONVENIENTESDifícil de mantener cuando creceTodo "a pelo"Difícil de probar
  22. 22. PUPPET / CHEFVENTAJASDocumentación"Librerías" ya hechas (módulos/cookbooks)Fácil de probarINCONVENIENTESAprendizaje
  23. 23. PUPPET¿QUÉ ES?Herramienta de gestión de configuración para servidoresDefine estados de recursosConfigura una vez, ejecútalo 1000 veces
  24. 24. PUPPETTERMINOLOGÍAManifests: DefinicionesModules: "Bundles"TemplatesFacter: Información sobre S.O. (y sistema)Hiera: "DB"
  25. 25. PUPPETMANIFESTS/examples/file-1.ppfile {testfile:path => /tmp/testfile,ensure => present,mode => 0640,content => "Im a test file.",}
  26. 26. PUPPETMANIFESTS/manifests/default.ppclass base {include mysqlinclude phpinclude apache}include base# óclass { base }
  27. 27. PUPPETMODULES/puppet/manifests/default.ppmodules/apache/manifests/ # Manifest in the moduleinit.ppfiles/ # Static filestemplates/vhost.erblib/ # plugins, custom facts, custom resource typestests/ # Example manifestsexamples/ # Example manifestsspec/ # Test with rspec-puppet
  28. 28. 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::installinclude apache::run}
  29. 29. PUPPETTEMPLATES/modules/apache/templates/vhost.erb<Directory /vagrant/web>Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyallow from allRewriteEngine OnRewriteBase /<%= project_name %>/webRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ app.php [QSA,L]DirectoryIndex app.php</Directory>
  30. 30. PUPPETTEMPLATES/modules/apache/manifests/init.pp$sitesavailable = /etc/apache2/sites-available$sitesenabled = /etc/apache2/sites-enabledfile { "$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],}
  31. 31. PUPPETFACTERarchitecture => 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
  32. 32. PUPPETHIERA# /etc/puppet/hieradata/appservers.yaml---proxies:- hostname: lb01.example.comipaddress: 192.168.22.21- hostname: lb02.example.comipaddress: 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
  33. 33. PUPPETCOMO AGENTE
  34. 34. PUPPETCOMO AGENTE/MAESTRO
  35. 35. ¿PROBLEMAS?COSAS A TENER EN CUENTADependenciasLas clases son singletonsRendimiento
  36. 36. ¿PROBLEMAS?DEPENDENCIASclass base {Class[system::resolv]-> Class[apache]-> Class[php]-> Apache::Vhost[dev]include system::resolvinclude apacheinclude phpapache::vhost {dev:project_name => $project_name}}include base
  37. 37. ¿PROBLEMAS?CLASES SON SINGLETONSclass 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,}
  38. 38. ¿PROBLEMAS?RENDIMIENTOSYMFONY TIENE + 9000 ARCHIVOSIt’s a long known issue that VirtualBox sharedfolder performance degrades quickly as thenumber of files in the shared folder increases.As a project reaches 1000+ files, doing simplethings 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).
  39. 39. ¿PROBLEMAS?RENDIMIENTOUsar 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
  40. 40. ¿PROBLEMAS?RENDIMIENTOVagrantfileVagrant.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
  41. 41. ¿PROBLEMAS?RENDIMIENTODesactivar Swapexec { disable-swap:path => /sbin,command => swapoff -a,user => root,}
  42. 42. ¿CÓMO LO USO EN MIS PROYECTOS?VALE, ME HAS CONVENCIDO, ¿Y AHORA CÓMO LO USO?
  43. 43. ¿CÓMO LO USO EN MIS PROYECTOS?(Casi) Listo para usarMódulos completosÚtil en proyectos empezadosHTTPS://PUPHPET.COM
  44. 44. ¿CÓMO LO USO EN MIS PROYECTOS?PROYECTOS NUEVOShttps://github.com/vicentgodella/symfony2-vagrant-skeletongit clone git@github.com:vicentgodella/symfony2-vagrant-skeleton.gitcomposer install# Añadir al /etc/hosts:127.0.0.1 sf2-vagrant.devCargar la url http://sf2-vagrant.dev:8080/app_dev.php en el navegador.
  45. 45. DEMO
  46. 46. ENLACES DE INTERÉSLIBROShttp://www.vagrantup.comhttp://www.puppetlabs.comhttp://forge.puppetlabs.comhttp://puphpet.comPuppet 2.7 CookbookPuppet Types and ProvidersPro PuppetPuppet 3 Beginners Guide
  47. 47. ¿PREGUNTAS?vicentgodella@gmail.com@vicentgodellahttps://joind.in/8846

×