entornos de desarrollo para symfony2 con vagrant y puppet
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
ALGO SOBRE MIVICENT SORIA DURÁ
Desarrollador Web (en Symfony 2)
Trabajo en Social Point como Automation Engineer
ÍNDICE1. Introducción2. ¿Qué es Vagrant?3. ¿Qué es Puppet?4. ¿Problemas?5. ¿Cómo lo uso en mis proyectos?
INTRODUCCIÓN¿Qué hacemos para preparar un nuevo ordenador?
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?
IDEPHPStormSublime Text 2NetbeansEclipse + PDTVi / Emacs
PREPARAR EL PROYECTOClonamos el repositorioConfiguramos virtual hostInstalamos vendorsCreamos BBDDPersonalizamos parameters.yml
PUESTA EN PRODUCCIÓN (O PRE-PRODUCCION)
¿Problemas?
¡Si en mi máquina funciona!
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
SOLUCIONESMismo S.O. para todosMismos paquetes instaladosMisma configuración en todos los entornos
SOLUCIONES¡Pero yo uso Mac!
¡Y yo Linux!
¡Y yo windows!
SOLUCIONESDisponemos de herramientas que nos ayudarán:
Vagrant (Virtualización)Puppet o Chef (Aprovisionamiento y configuración)
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.
VAGRANT¿Qué es?
Herramienta de virtualizaciónPermite crear y configurar entornos de desarrolloportables, ligeros y reproducibles
VAGRANTPermite utilizar diversos proveedores
VirtualBoxVMware (De pago)Amazon Web ServicesLos nuestros propios
VAGRANTREQUISITOS
Virtual Box: Vagrant:
https://www.virtualbox.org/http://www.vagrantup.com/
VAGRANT¿CÓMO SE USA?
OTRAS IMÁGENES
http://www.vagrantbox.es
$ vagrant init precise64 http://files.vagrantup.com/precise64.box$ vagrant up
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
VAGRANTVAGRANTFILE
Vagrant.configure("2") do |config| config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"end
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
PUPPETExisten varias herramientas de automatización para la
configuración de sistemas
Scripts de shellChef (Solo y Client)Puppet (Apply y Agent)
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
PUPPET / CHEFVENTAJAS
Documentación"Librerías" ya hechas (módulos/cookbooks)Fácil de probar
INCONVENIENTES
Aprendizaje
PUPPET¿QUÉ ES?
Herramienta de gestión de configuración para servidoresDefine estados de recursosConfigura una vez, ejecútalo 1000 veces
PUPPETTERMINOLOGÍA
Manifests: DefinicionesModules: "Bundles"TemplatesFacter: Información sobre S.O. (y sistema)Hiera: "DB"
PUPPETMANIFESTS
/examples/file-1.pp
file {'testfile': path => '/tmp/testfile', ensure => present, mode => 0640, content => "I'm a test file.",}
PUPPETMANIFESTS
/manifests/default.pp
class base { include mysql include php include apache}
include base# óclass { 'base' }
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
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}
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>
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'], }
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
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
PUPPETCOMO AGENTE
PUPPETCOMO AGENTE/MAESTRO
¿PROBLEMAS?COSAS A TENER EN CUENTA
DependenciasLas clases son singletonsRendimiento
¿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
¿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,}
¿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).
¿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
¿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
¿PROBLEMAS?RENDIMIENTO
Desactivar Swap exec { 'disable-swap': path => '/sbin', command => 'swapoff -a', user => 'root',}
¿CÓMO LO USO EN MIS PROYECTOS?
VALE, ME HAS CONVENCIDO, ¿Y AHORA CÓMO LO USO?
¿CÓMO LO USO EN MIS PROYECTOS?
(Casi) Listo para usarMódulos completosÚtil en proyectos empezados
HTTPS://PUPHPET.COM
¿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.
DEMO
ENLACES DE INTERÉS
LIBROS
http://www.vagrantup.comhttp://www.puppetlabs.comhttp://forge.puppetlabs.comhttp://puphpet.com
Puppet 2.7 CookbookPuppet Types and ProvidersPro PuppetPuppet 3 Beginner's Guide