entornos de desarrollo para symfony2 con vagrant y puppet

Post on 22-Nov-2014

3.578 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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 git@github.com: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

¿PREGUNTAS?

vicentgodella@gmail.com

@vicentgodellahttps://joind.in/8846

top related