SlideShare ist ein Scribd-Unternehmen logo
1 von 40
VIRTUALIZACIÓN Y PROVISIONAMIENTO

Virtualización y
Provisionamiento:
Entornos de desarrollo con
Vagrant y Puppet
Daniel Acedos
VIRTUALIZACIÓN CON VAGRANT
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
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
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
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/
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Configuración del BOX
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Redireccionamiento de puertos


Añadir uno a uno los puertos redireccionados
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Carpetas Compartidas
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Instalar paquetes
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Servidor WEB. Módulos
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Servidor Web. Virtual Host
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: PHP
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: PHP - Extensiones
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
VIRTUALIZACIÓN CON VAGRANT
PUPHPET: Bases de datos No SQL


Es necesario añadirla para poder configurar
VIRTUALIZACIÓN CON VAGRANT

Configuración manual
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
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
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"
...
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)
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
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"

...
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"
...
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
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
APROVISIONAMIENTO CON PUPPET
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.
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
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
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': }
...
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
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,
}
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'],
}
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': }
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']
}
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']
}
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
}
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': }
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': }

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Vagrant
VagrantVagrant
Vagrant
 
Una introducción a vagrant
Una introducción a vagrantUna introducción a vagrant
Una introducción a vagrant
 
Sandbox para ejercicios de programación
Sandbox para ejercicios de programaciónSandbox para ejercicios de programación
Sandbox para ejercicios de programación
 
De desarrollo a producción usando docker
De desarrollo a producción usando dockerDe desarrollo a producción usando docker
De desarrollo a producción usando docker
 
Dev ops infraestructura agil con open source
Dev ops   infraestructura agil con open sourceDev ops   infraestructura agil con open source
Dev ops infraestructura agil con open source
 
Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...
 
Docker - Sysmana 2014
Docker - Sysmana 2014Docker - Sysmana 2014
Docker - Sysmana 2014
 
Virtualenv y buildout
Virtualenv y buildoutVirtualenv y buildout
Virtualenv y buildout
 
Armitage pruebas
Armitage pruebasArmitage pruebas
Armitage pruebas
 
Usando Django con Docker
Usando Django con DockerUsando Django con Docker
Usando Django con Docker
 
FROM lost to the docker
FROM lost to the dockerFROM lost to the docker
FROM lost to the docker
 
Docker 2014 v2
Docker 2014 v2Docker 2014 v2
Docker 2014 v2
 
Open Build Service
Open Build ServiceOpen Build Service
Open Build Service
 
Exprime al máximo la capacidad de tus servidores gracias a la virtualización ...
Exprime al máximo la capacidad de tus servidores gracias a la virtualización ...Exprime al máximo la capacidad de tus servidores gracias a la virtualización ...
Exprime al máximo la capacidad de tus servidores gracias a la virtualización ...
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHP
 
Dbdeployer
DbdeployerDbdeployer
Dbdeployer
 
Inf tec estandariza_comp_escrit
Inf tec estandariza_comp_escritInf tec estandariza_comp_escrit
Inf tec estandariza_comp_escrit
 
Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2Cómo explotar EternalBlue en Windows Server 2012 R2
Cómo explotar EternalBlue en Windows Server 2012 R2
 
Ansible DevOps Day Peru 2016
Ansible DevOps Day Peru 2016Ansible DevOps Day Peru 2016
Ansible DevOps Day Peru 2016
 
Introduccion a kata containers
Introduccion a kata containersIntroduccion a kata containers
Introduccion a kata containers
 

Andere mochten auch

Curso puppet lenguaje_2
Curso puppet lenguaje_2Curso puppet lenguaje_2
Curso puppet lenguaje_2
martacdehesa
 

Andere mochten auch (8)

Curso puppet lenguaje_2
Curso puppet lenguaje_2Curso puppet lenguaje_2
Curso puppet lenguaje_2
 
Gestionando servidores con Puppet
Gestionando servidores con PuppetGestionando servidores con Puppet
Gestionando servidores con Puppet
 
Discovering New Apps
Discovering New AppsDiscovering New Apps
Discovering New Apps
 
Erase una vez
Erase  una vezErase  una vez
Erase una vez
 
Dev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónDev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producción
 
Vagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de usoVagrant y Docker - Guía práctica de uso
Vagrant y Docker - Guía práctica de uso
 
Dev ops. Rompiendo Barreras
Dev ops. Rompiendo BarrerasDev ops. Rompiendo Barreras
Dev ops. Rompiendo Barreras
 
Drone Continuous Integration
Drone Continuous IntegrationDrone Continuous Integration
Drone Continuous Integration
 

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

Ähnlich wie Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet (20)

FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020
 
Integrando sonar
Integrando sonarIntegrando sonar
Integrando sonar
 
Entornos de desarrollo portables, reproducibles y ligeros
Entornos de desarrollo portables, reproducibles y ligerosEntornos de desarrollo portables, reproducibles y ligeros
Entornos de desarrollo portables, reproducibles y ligeros
 
Oracle VM VirtualBox Hacked
Oracle VM VirtualBox HackedOracle VM VirtualBox Hacked
Oracle VM VirtualBox Hacked
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJC
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualización
 
Docker - Entorno de trabajo configurado en 1 minuto [WCBilbao]
Docker - Entorno de trabajo configurado en 1 minuto [WCBilbao]Docker - Entorno de trabajo configurado en 1 minuto [WCBilbao]
Docker - Entorno de trabajo configurado en 1 minuto [WCBilbao]
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 
Cuckoosandbox
CuckoosandboxCuckoosandbox
Cuckoosandbox
 
Para que sirve la virtualizacion
Para que sirve la virtualizacionPara que sirve la virtualizacion
Para que sirve la virtualizacion
 
Para que sirve la virtualizacion
Para que sirve la virtualizacion Para que sirve la virtualizacion
Para que sirve la virtualizacion
 
Introduccion A Docker
Introduccion A DockerIntroduccion A Docker
Introduccion A Docker
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 
Jug málaga docker 101 - final
Jug málaga   docker 101 - finalJug málaga   docker 101 - final
Jug málaga docker 101 - final
 
Dockers y wp
Dockers y wpDockers y wp
Dockers y wp
 
Docker desde cero
Docker desde ceroDocker desde cero
Docker desde cero
 
VIRTUALBOX
VIRTUALBOX VIRTUALBOX
VIRTUALBOX
 
docker.pdf
docker.pdfdocker.pdf
docker.pdf
 
Maquina virtual
Maquina virtualMaquina virtual
Maquina virtual
 
Sor8 cm3 hernandez o maria judith-virtualbox
Sor8 cm3 hernandez o maria judith-virtualboxSor8 cm3 hernandez o maria judith-virtualbox
Sor8 cm3 hernandez o maria judith-virtualbox
 

Kürzlich hochgeladen

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Kürzlich hochgeladen (12)

PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 

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

  • 1. VIRTUALIZACIÓN Y PROVISIONAMIENTO Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet Daniel Acedos
  • 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/
  • 7. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Configuración del BOX
  • 8. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Redireccionamiento de puertos  Añadir uno a uno los puertos redireccionados
  • 11. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Servidor WEB. Módulos
  • 12. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Servidor Web. Virtual Host
  • 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. VIRTUALIZACIÓN CON VAGRANT PUPHPET: Bases de datos No SQL  Es necesario añadirla para poder configurar
  • 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
  • 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. 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. 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. 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
  • 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. 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. 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 }
  • 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': }