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. 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. 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. 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/
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
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. 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
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)
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. 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. 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. 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
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. 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. 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. 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 básicos que queremos tener
instalados en nuestra máquina virtual
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. 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. 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. 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
}