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

5,326 views
6,045 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,326
On SlideShare
0
From Embeds
0
Number of Embeds
4,138
Actions
Shares
0
Downloads
38
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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

  1. 1. VIRTUALIZACIÓN Y PROVISIONAMIENTO Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet Daniel Acedos
  2. 2. VIRTUALIZACIÓN CON VAGRANT
  3. 3. VIRTUALIZACIÓN CON VAGRANT VAGRANT  http://www.vagrantup.com/  Vagrant es una herramienta para la creación y configuración de entornos de desarrollo virtualizados.  Originalmente se desarrolló para VirtualBox y sistemas de configuración tales como Chef, Salt y Puppet.  Desde la versión 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. 4. VIRTUALIZACIÓN CON VAGRANT BOXES  Vagrant no construye máquinas virtuales desde cero   Lento Tedioso  Utiliza imágenes llamadas BOXES para clonar máquinas virtuales rápidamente  Especificar el BOX a utilizar es siempre el primer paso en un fichero Vagrantfile  Los boxes, una vez descargados se guardan en ~/.vagrant.d/boxes  Pueden empaquetarse de nuevo con el comando package
  5. 5. VIRTUALIZACIÓN CON VAGRANT VAGRANTFILE  Describe el tipo de máquina que se utilizará en el proyecto y cómo configurar y aprovisionar dichas máquinas  El nombre del fichero descriptor tiene que ser vagrantfile  Un solo Vagrantfile por proyecto  Multiplataforma  Sintaxis Ruby   No es necesario conocer la sintaxis de Ruby Prácticamente es sólo asignación de variables
  6. 6. VIRTUALIZACIÓN CON VAGRANT PUPHPET  Herramienta gráfica online para crear proyectos con Vagrant de una manera sencilla  Nos ayuda a generar el Vagrantfile mediante un asistente  https://puphpet.com/
  7. 7. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Configuración del BOX
  8. 8. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Redireccionamiento de puertos  Añadir uno a uno los puertos redireccionados
  9. 9. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Carpetas Compartidas
  10. 10. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Instalar paquetes
  11. 11. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Servidor WEB. Módulos
  12. 12. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Servidor Web. Virtual Host
  13. 13. VIRTUALIZACIÓN CON VAGRANT PUPHPET: PHP
  14. 14. VIRTUALIZACIÓN CON VAGRANT PUPHPET: PHP - Extensiones
  15. 15. VIRTUALIZACIÓN 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. 16. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Bases de datos No SQL  Es necesario añadirla para poder configurar
  17. 17. VIRTUALIZACIÓN CON VAGRANT Configuración manual
  18. 18. VIRTUALIZACIÓN CON VAGRANT VAGRANTFILE  Describe el tipo de máquina que se utilizará en el proyecto y cómo configurar y aprovisionar dichas máquinas  El nombre del fichero descriptor tiene que ser vagrantfile  Un solo Vagrantfile por proyecto  Multiplataforma  Sintaxis Ruby   No es necesario conocer la sintaxis de Ruby Prácticamente es sólo asignación de variables
  19. 19. VIRTUALIZACIÓN CON VAGRANT VAGRANTFILE: DEFINIR BOX config.vm.define :XXX do |XXX| XXX.vm.box =”” Tipo de imagen XXX.vm.box_url = “” Url de la que se descarga el Box XXX.vm.network :private_network, ip: “" IP de la máquina virtual. Para las configuraciones con una sola máquina 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 repositorio XXX.vm.network :forwarded_port, host: XX, guest: YY XXX.vm.hostname = "XXX.dev" Nombre de dominio de la máquina virtual
  20. 20. VIRTUALIZACIÓN 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. 21. VIRTUALIZACIÓN CON VAGRANT PARÁMETROS DE LA MÁQUINA VIRTUAL emting.vm.provider "virtualbox" do |XXX| XXX.customize ["modifyvm", :id, "--param", "value"] --name Nombre que tendrá la máquina dentro del listado de MV's de VirtualBox --cpus Nº de CPU's de la MV. No conviene poner más de 1 --memory 512Mb sería suficiente para la mayoría de los casos Si utilizamos "mongo" → mínimo 2Gb --ioapic Desactiva la propiedad "ioapic" del procesador --natdnsresolver1 Resolver las DNS a través de la interfaz de NAT --nictype1 Tipo de tarjeta(s) de red: paravirtualizado (más rendimiento)
  22. 22. VIRTUALIZACIÓN 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. 23. VIRTUALIZACIÓN CON VAGRANT  Es necesario hacer el apt-get update antes del provisionamiento para asegurar que todos los paquetes descargados estén en la última versión ... # 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. 24. VIRTUALIZACIÓN CON VAGRANT CARPETAS COMPARTIDAS  Pueden compartirse carpetas locales en la máquina virtual creada  XXX.vm.synced_folder LOCAL_DIR, REMOTE_DIR, id: "AAA", :owner => "BBB", :group => "CCC”  Para proyectos PHP que utilicen es necesario compartir la carpeta con el código. 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. 25. VIRTUALIZACIÓN CON VAGRANT APROVISIONAMIENTO  Hay que indicar a Vagrant una configuración mínima para realizar el aprovisionamiento con Puppet  puppet.manifests_path Directorio con los ficheros de configuración de puppet puppet.module_path  Directorio con los módulos 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. 26. VIRTUALIZACIÓN CON VAGRANT COMANDOS VAGRANT  vagrant status  vagrant up  vagrant halt  vagrant destroy  vagrant provision  Sabemos que lo ha hecho bien cuando veamos el mensaje ... Info: Applying configuration version '1389860822' ...  vagrant package  vagrant ssh
  27. 27. APROVISIONAMIENTO CON PUPPET
  28. 28. APROVISIONAMIENTO CON PUPPET PUPPET  http://puppetlabs.com/  herramienta diseñada para administrar la configuración 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 información del sistema a través de una utilidad llamada Facter.  http://projects.puppetlabs.com/projects/facter  Compila los manifiestos en un catálogo específico que contiene los recursos y la dependencia de dichos recursos.  Los catálogos son ejecutados en los sistemas de destino.
  29. 29. APROVISIONAMIENTO CON PUPPET PUPPET  Instalar Puppet   Fichero de configuración puppet     sudo apt-get install puppet Dentro del directorio manifests default.pp Lenguage puppet Módulos puppet     Es cómo 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 descargarán en directorios relativos al proyecto  Garantiza independencia del proyecto
  30. 30. APROVISIONAMIENTO CON PUPPET MODULES  Para que nuestros proyectos de Vagrant y puppet sean independientes los módulos se gestionarán de manera aislada para cada proyecto.   puppet module search   --modulepath modules Buscar módulos en el market de puppet Puppet module list --modulepath modules  lista los módulos instalados en el proyecto  puppet module install XXX --modulepath modules  puppet module uninstall XXX --modulepath modules  Cada módulo dispone de su propia página de ayuda donde se explica como instalarlo y configurarlo
  31. 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. 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 básicos que queremos tener instalados en nuestra máquina virtual
  33. 33. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MÓDULO APACHE  example42-apache   https://github.com/example42/puppet-apache puppet 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. 34. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MÓDULO PHP  example42-php   https://github.com/example42/puppet-php puppet 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. 35. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MÓDULO MONGODB  puppetlabs-mongodb   https://forge.puppetlabs.com/puppetlabs/mongodb puppet module install example42-mongodb --modulepath modules ... ... php::pecl::module { 'mongo': use_package => false, } class {'::mongodb::globals': manage_package_repo => true, }-> class {'::mongodb::server': }
  36. 36. APROVISIONAMIENTO CON PUPPET CLASS PACKAGES: MÓDULO COMPOSER  Willdurand-composer   https://forge.puppetlabs.com/willdurand/composer puppet module install willdurand-composer --modulepath modules ... ... class { 'composer': require => Package['php5', 'curl'] }
  37. 37. APROVISIONAMIENTO CON PUPPET CLASS FILES  Modifica ficheros dentro del sistema de la máquina virtual  Activar extensión 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-data exec {'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 reiniciar file {"/etc/apache2/sites-enabled/000-default": ensure => 'absent', before => Service['apache'] }
  38. 38. APROVISIONAMIENTO CON PUPPET CLASS DEPLOY  Ejecuta instrucciones para realizar el despliegue  Ejecutar composer para descargar las librerías del proyecto  En Debian es necesaria la línea 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. 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. 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': }

×