virtualización y provisionamiento: entornos de desarrollo con vagrant y puppet

Download Virtualización y  Provisionamiento: Entornos de desarrollo con  Vagrant y Puppet

If you can't read please download the document

Upload: richard-moya

Post on 22-May-2015

2.710 views

Category:

Technology


1 download

TRANSCRIPT

  • 1. VIRTUALIZACIN Y PROVISIONAMIENTOVirtualizacin y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet Daniel Acedos

2. VIRTUALIZACIN CON VAGRANT 3. VIRTUALIZACIN CON VAGRANT VAGRANT http://www.vagrantup.com/Vagrant es una herramienta para la creacin y configuracin de entornos de desarrollo virtualizados.Originalmente se desarroll para VirtualBox y sistemas de configuracin tales como Chef, Salt y Puppet.Desde la versin 1.1 Vagrant es capaz de trabajar con multiples proveedores VMware, Amazon EC2, LXC, DigitalOcean...Aunque Vagrant se ha desarrollado en Ruby se puede usar en multitud de projectos escritos en otros lenguajes PHP, Python, Java, C# y JavaScript 4. VIRTUALIZACIN CON VAGRANT BOXES Vagrant no construye mquinas virtuales desde cero Lento TediosoUtiliza imgenes llamadas BOXES para clonar mquinas virtuales rpidamenteEspecificar el BOX a utilizar es siempre el primer paso en un fichero VagrantfileLos boxes, una vez descargados se guardan en ~/.vagrant.d/boxesPueden empaquetarse de nuevo con el comando package 5. VIRTUALIZACIN CON VAGRANT VAGRANTFILE Describe el tipo de mquina que se utilizar en el proyecto y cmo configurar y aprovisionar dichas mquinasEl nombre del fichero descriptor tiene que ser vagrantfileUn solo Vagrantfile por proyectoMultiplataformaSintaxis Ruby No es necesario conocer la sintaxis de Ruby Prcticamente es slo asignacin de variables 6. VIRTUALIZACIN CON VAGRANT PUPHPET Herramienta grfica online para crear proyectos con Vagrant de una manera sencillaNos ayuda a generar el Vagrantfile mediante un asistentehttps://puphpet.com/ 7. VIRTUALIZACIN CON VAGRANT PUPHPET: Configuracin del BOX 8. VIRTUALIZACIN CON VAGRANT PUPHPET: Redireccionamiento de puertos Aadir uno a uno los puertos redireccionados 9. VIRTUALIZACIN CON VAGRANT PUPHPET: Carpetas Compartidas 10. VIRTUALIZACIN CON VAGRANT PUPHPET: Instalar paquetes 11. VIRTUALIZACIN CON VAGRANT PUPHPET: Servidor WEB. Mdulos 12. VIRTUALIZACIN CON VAGRANT PUPHPET: Servidor Web. Virtual Host 13. VIRTUALIZACIN CON VAGRANT PUPHPET: PHP 14. VIRTUALIZACIN CON VAGRANT PUPHPET: PHP - Extensiones 15. VIRTUALIZACIN CON VAGRANT PUPHPET: Bases de datos SQL Si no queremos base de datos SQL tendremos que eliminarla o no podremos finalizar sin haberla configurado 16. VIRTUALIZACIN CON VAGRANT PUPHPET: Bases de datos No SQL Es necesario aadirla para poder configurar 17. VIRTUALIZACIN CON VAGRANTConfiguracin manual 18. VIRTUALIZACIN CON VAGRANT VAGRANTFILE Describe el tipo de mquina que se utilizar en el proyecto y cmo configurar y aprovisionar dichas mquinasEl nombre del fichero descriptor tiene que ser vagrantfileUn solo Vagrantfile por proyectoMultiplataformaSintaxis Ruby No es necesario conocer la sintaxis de Ruby Prcticamente es slo asignacin de variables 19. VIRTUALIZACIN CON VAGRANT VAGRANTFILE: DEFINIR BOX config.vm.define :XXX do |XXX| XXX.vm.box = Tipo de imagenXXX.vm.box_url = Url de la que se descarga el BoxXXX.vm.network :private_network, ip: "IP de la mquina virtual. Para las configuraciones con una sola mquina siempre la 10.12.12.2 Cuando se tenga que trabajar con dos proyectos distintos a la vez Se modifica localmente y no se sube el cambio al repositorioXXX.vm.network :forwarded_port, host: XX, guest: YY XXX.vm.hostname = "XXX.dev"Nombre de dominio de la mquina virtual 20. VIRTUALIZACIN CON VAGRANT VAGRANTFILE: DEFINIR BOX... config.vm.define :emting do |emting| emting.vm.box = "gigigo-oc-wheezy-7.2-x64.box" emting.vm.box_url = "http://box.gigigo.com/gigigo-oc-wheezy-7.2-x64.box" emting.vm.network :private_network, ip: "10.12.12.2" emting.vm.network :forwarded_port, host: 81, guest: 80 emting.vm.network :forwarded_port, host: 27018, guest: 27017 emting.vm.hostname = "emting.dev" ... 21. VIRTUALIZACIN CON VAGRANT PARMETROS DE LA MQUINA VIRTUAL emting.vm.provider "virtualbox" do |XXX| XXX.customize ["modifyvm", :id, "--param", "value"] --name Nombre que tendr la mquina dentro del listado de MV's de VirtualBox --cpus N de CPU's de la MV. No conviene poner ms de 1 --memory 512Mb sera suficiente para la mayora de los casos Si utilizamos "mongo" mnimo 2Gb --ioapic Desactiva la propiedad "ioapic" del procesador --natdnsresolver1 Resolver las DNS a travs de la interfaz de NAT --nictype1 Tipo de tarjeta(s) de red: paravirtualizado (ms rendimiento) 22. VIRTUALIZACIN CON VAGRANT......emting.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--name", "emting"] v.customize ["modifyvm", :id, "--cpus", "1"] v.customize ["modifyvm", :id, "--memory", 2048] v.customize ["modifyvm", :id, "--ioapic", "off"] v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] v.customize ['modifyvm', :id, '--nictype1', 'virtio'] v.customize ['modifyvm', :id, '--nictype2', 'virtio'] end 23. VIRTUALIZACIN CON VAGRANTEs necesario hacer el apt-get update antes del provisionamiento para asegurar que todos los paquetes descargados estn en la ltima versin ...# Update package list emting.vm.provision :shell, :inline => if [[ ! -f /apt-get-run ]]; then sudo apt-get update && sudo touch /apt-get-run; fi"... 24. VIRTUALIZACIN CON VAGRANT CARPETAS COMPARTIDAS Pueden compartirse carpetas locales en la mquina virtual creadaXXX.vm.synced_folder LOCAL_DIR, REMOTE_DIR, id: "AAA", :owner => "BBB", :group => "CCCPara proyectos PHP que utilicen es necesario compartir la carpeta con el cdigo. Si el proyecto utiliza composer, compartiremos tambien la carpeta .composer de nuestro home del usuario... emting.vm.synced_folder "../", "/var/www/emting", id: "vagrantemting", :owner => "www-data", :group => "www-data" ... 25. VIRTUALIZACIN CON VAGRANT APROVISIONAMIENTO Hay que indicar a Vagrant una configuracin mnima para realizar el aprovisionamiento con Puppetpuppet.manifests_pathDirectorio con los ficheros de configuracin de puppetpuppet.module_pathDirectorio con los mdulos a instalar...# ...# Puppet provision emting.vm.provision :puppet do |puppet| puppet.manifests_path = "manifests" puppet.module_path = "modules" puppet.options = ['--verbose'] puppet.options = ['--debug'] end 26. VIRTUALIZACIN CON VAGRANT COMANDOS VAGRANT vagrant statusvagrant upvagrant haltvagrant destroyvagrant provision Sabemos que lo ha hecho bien cuando veamos el mensaje... Info: Applying configuration version '1389860822' ... vagrant packagevagrant ssh 27. APROVISIONAMIENTO CON PUPPET 28. APROVISIONAMIENTO CON PUPPET PUPPET http://puppetlabs.com/herramienta diseada para administrar la configuracin de sistemas Unix y Microsoft Windows de forma declarativa.Describe los recursos del sistema y sus estados utilizando el lenguaje declarativo que proporciona Puppet.Puppet descubre la informacin del sistema a travs de una utilidad llamada Facter. http://projects.puppetlabs.com/projects/facterCompila los manifiestos en un catlogo especfico que contiene los recursos y la dependencia de dichos recursos.Los catlogos son ejecutados en los sistemas de destino. 29. APROVISIONAMIENTO CON PUPPET PUPPET Instalar Puppet Fichero de configuracin puppet sudo apt-get install puppetDentro del directorio manifests default.pp Lenguage puppetMdulos puppet Es cmo puppet encuentra las clases y tipos que puede usar. oficiales de puppet o desarrollados por terceros. Fuentes fiables: Puppetlabs Example42 Tienen que estar descargados antes de poder instalarse. Se descargarn en directorios relativos al proyecto Garantiza independencia del proyecto 30. APROVISIONAMIENTO CON PUPPET MODULES Para que nuestros proyectos de Vagrant y puppet sean independientes los mdulos se gestionarn de manera aislada para cada proyecto. puppet module search --modulepath modulesBuscar mdulos en el market de puppetPuppet module list --modulepath modules lista los mdulos instalados en el proyectopuppet module install XXX --modulepath modulespuppet module uninstall XXX --modulepath modulesCada mdulo dispone de su propia pgina de ayuda donde se explica como instalarlo y configurarlo 31. APROVISIONAMIENTO CON PUPPET FICHERO DEFAULT.PP Puede dividirse en bloques (classes) y ejecutarse secuencialmente:... class prepare { [...] } class packages { [...] } class files { [...] } class deploy{ [...] } # Ordered execution class {'prepare': } -> class {'packages': } -> class {'files': } -> class {'deploy': } ... 32. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: PACKAGE ......class packages { package { [ 'bmon', 'build-essential', 'ccze', 'curl', 'git-core', 'htop', 'iotop', 'joe', 'multitail', 'vim', ]: ensure => 'installed', }Descarga los comandos bsicos que queremos tener instalados en nuestra mquina virtual 33. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MDULO APACHE example42-apache https://github.com/example42/puppet-apachepuppet module install example42-apache --modulepath modules ...class { 'apache': } apache::dotconf { 'custom': content => 'EnableSendfile Off', } apache::module { 'rewrite': }...apache::vhost { 'emting': source => 'puppet:///modules/apache/vhosts/emting.conf.erb', template => '', priority => 1, } 34. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MDULO PHP example42-php https://github.com/example42/puppet-phppuppet module install example42-php --modulepath modules ......class { 'php': service => 'apache', service_autorestart => false, module_prefix => '', } php::module { 'php-apc': } php::module { 'php5-sqlite': } php::module { 'php5-cli': } php::module { 'php5-curl': } php::module { 'php5-intl': } php::module { 'php5-mcrypt': } class { 'php::devel': require => Class['php'], } class { 'php::pear': require => Class['php'], } 35. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MDULO MONGODB puppetlabs-mongodb https://forge.puppetlabs.com/puppetlabs/mongodbpuppet module install example42-mongodb --modulepath modules ......php::pecl::module { 'mongo': use_package => false, } class {'::mongodb::globals': manage_package_repo => true, }-> class {'::mongodb::server': } 36. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MDULO COMPOSER Willdurand-composer https://forge.puppetlabs.com/willdurand/composerpuppet module install willdurand-composer --modulepath modules ......class { 'composer': require => Package['php5', 'curl'] } 37. APROVISIONAMIENTO CON PUPPET CLASS FILES Modifica ficheros dentro del sistema de la mquina virtualActivar extensin de PHP en apache exec {"mongophpextension": command => 'echo "extension=mongo.so" > /etc/php5/conf.d/mongo.ini', user => 'root', }Cambiar el shell por defecto para el usuario www-dataexec {'changedefaultshellwwwdata': command => 'sed -i "s/www-data:x:33:33:www-data:/var/www:/bin/sh/wwwdata:x:33:33:www-data:/var/www:/bin/bash/" /etc/passwd', user => root, cwd => "/root" }Deshabilitar el sitio por defecto de apache y reiniciarfile {"/etc/apache2/sites-enabled/000-default": ensure => 'absent', before => Service['apache'] } 38. APROVISIONAMIENTO CON PUPPET CLASS DEPLOY Ejecuta instrucciones para realizar el despliegueEjecutar composer para descargar las libreras del proyectoEn Debian es necesaria la lnea de environment, en otras distribuciones como Ubuntu no hace falta......exec { 'composerinstall': environment => ["COMPOSER_HOME=/var/www/.composer"], command => 'composer install --no-interaction', cwd => '/var/www/emting/', user => 'www-data', timeout => 900 } 39. APROVISIONAMIENTO CON PUPPET EJEMPLO DEFAULT.PP COMPLETO ## EMT - Emting Exec { path => [ '/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/' ], logoutput => 'on_failure' } class prepare { class {'apt': } } class packages { package { [ 'bmon', 'build-essential', 'ccze', 'curl', 'git-core', 'htop', 'iotop', 'joe', 'multitail', 'vim', ]: ensure => 'installed', } class { 'apache': } apache::dotconf { 'custom': content => 'EnableSendfile Off', }php::module { 'php-apc': } php::module { 'php5-sqlite': } php::module { 'php5-cli': } php::module { 'php5-curl': } php::module { 'php5-intl': } php::module { 'php5-mcrypt': } class { 'php::devel': require => Class['php'], } class { 'php::pear': require => Class['php'], } php::pecl::module { 'mongo': use_package => false, } class {'::mongodb::globals': manage_package_repo => true, }-> class {'::mongodb::server': }}class { 'composer': require => Package['php5', 'curl'] }apache::module { 'rewrite': } apache::vhost { 'emting': source => 'puppet:///modules/apache/vhosts/emting.conf.erb', template => '', priority => 1, } class { 'php': service => 'apache', service_autorestart => false, module_prefix => '', }class files { exec {"mongophpextension": command => 'echo "extension=mongo.so" > /etc/php5/conf.d/mongo.ini', user => 'root', }exec {'changedefaultshellwwwdata': command => 'sed -i "s/www-data:x:33:33:wwwdata:/var/www:/bin/sh/www-data:x:33:33:wwwdata:/var/www:/bin/bash/" /etc/passwd', user => root, cwd => "/root" } file {"/etc/apache2/sites-enabled/000-default": ensure => 'absent', before => Service['apache'] } } # Deploy class deploy { exec { 'composerinstall': environment => ["COMPOSER_HOME=/var/www/.composer"], command => 'composer install --no-interaction', cwd => '/var/www/emting/', user => 'www-data', timeout => 900 } } # Ordered execution class {'prepare': } -> class {'packages': } -> class {'files': } -> class {'deploy': } 40. APROVISIONAMIENTO CON PUPPET EJEMPLO DEFAULT.PP COMPLETO ## EMT - Emting Exec { path => [ '/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/' ], logoutput => 'on_failure' } class prepare { class {'apt': } } class packages { package { [ 'bmon', 'build-essential', 'ccze', 'curl', 'git-core', 'htop', 'iotop', 'joe', 'multitail', 'vim', ]: ensure => 'installed', } class { 'apache': } apache::dotconf { 'custom': content => 'EnableSendfile Off', }php::module { 'php-apc': } php::module { 'php5-sqlite': } php::module { 'php5-cli': } php::module { 'php5-curl': } php::module { 'php5-intl': } php::module { 'php5-mcrypt': } class { 'php::devel': require => Class['php'], } class { 'php::pear': require => Class['php'], } php::pecl::module { 'mongo': use_package => false, } class {'::mongodb::globals': manage_package_repo => true, }-> class {'::mongodb::server': }}class { 'composer': require => Package['php5', 'curl'] }apache::module { 'rewrite': } apache::vhost { 'emting': source => 'puppet:///modules/apache/vhosts/emting.conf.erb', template => '', priority => 1, } class { 'php': service => 'apache', service_autorestart => false, module_prefix => '', }class files { exec {"mongophpextension": command => 'echo "extension=mongo.so" > /etc/php5/conf.d/mongo.ini', user => 'root', }exec {'changedefaultshellwwwdata': command => 'sed -i "s/www-data:x:33:33:wwwdata:/var/www:/bin/sh/www-data:x:33:33:wwwdata:/var/www:/bin/bash/" /etc/passwd', user => root, cwd => "/root" } file {"/etc/apache2/sites-enabled/000-default": ensure => 'absent', before => Service['apache'] } } # Deploy class deploy { exec { 'composerinstall': environment => ["COMPOSER_HOME=/var/www/.composer"], command => 'composer install --no-interaction', cwd => '/var/www/emting/', user => 'www-data', timeout => 900 } } # Ordered execution class {'prepare': } -> class {'packages': } -> class {'files': } -> class {'deploy': }