SlideShare una empresa de Scribd logo
1 de 78
Descargar para leer sin conexión
Gestión de la
Configuración con
- Puppet -
@jmoratilla @ricbartm@madrid_devops
Indice
Introducción
> Qué es puppet?
> Cómo lo hace?
Componentes
> Lenguaje
> Puppet client
> Puppet Master
Puppet @ abstra
Puppet @ tuenti
@jmoratilla @ricbartm
Ponentes
Qué es puppet?
-- Sistema de gestión de la configuración
++ claaaroo... ¿Y eso para qué sirve?
-- Sirve para configurar y mantener un grupo de
máquinas, todas iguales, de forma fácil y
sencilla.
++ Ya! y algo más?
-- Permite actualizar automáticamente la
configuración de las máquinas, y auditarlas.
++ Ok.
Por qué puppet?
Consistencia y flexibilidad
● La configuración manual no es
recomendable. Errores humanos.
● Las "Golden Images" son un quebradero de
cabeza.
Por qué puppet?
Consistencia y flexibilidad
● La configuración y el mantenimiento se
realiza desde un control central.
● Permite reproducir configuraciones
completas en caso de desastre (10th floor
test).
Por qué puppet?
Consistencia y flexibilidad
● Roles, clases y nodos: misma definición,
misma configuración, o no ;)
● Un agente corre cada 30 minutos: cada 30
minutos se comprueba que todo está en su
sitio, y si no, se vuelve a poner en su sitio.
Por qué puppet?
Operativa
● La curva de aprendizaje y el <grin> "Time To
Market" </grin> son muy cortos.
● Toda la lógica de configuración bajo Puppet:
permite que cualquiera lo lea y entienda sin
tener que indagar.
● No más páginas horribles explicando cómo
configurar algo. Céntrate en el servicio en sí.
Por qué puppet?
Portabilidad
● La configuración, al ser reproducible,
permite llevar el servicio a una nube privada,
pública, o a un entorno de pruebas aislado
con facilidad.
● Si los módulos están bien escritos, no
debería importar mucho si se trata de
Debian, Ubuntu, CentOS o RHEL.
Cómo lo hace?
Tecnología
● Basado en lenguaje ruby.
● Utiliza un lenguaje específico de dominio
(DSL) orientado a "recursos"
Recursos? Comandos, Usuarios,
Ficheros, Paquetes de software,
Servicios, Configuraciones específicas,
etc.
Cómo lo hace?
La práctica:
Stand Alone (puppet apply)
● El programa (agente) accede a unos ficheros de
definición (.pp)
● Verifica si el estado de los recursos indicados en el
fichero coinciden con la situación actual.
● Si todo es correcto, aplica los cambios hasta
coincidir con lo indicado en el fichero de definición.
nodo
SCM
init.pp
Binarios
Fuentes
Cómo lo hace?
La práctica:
Servidor (puppetmaster)
● El cliente (agente) conecta al master y le envía
información de sí mismo. Parte de esa información
podría ser reutilizada para generar el catálogo (IP,
hostname, etc).
● El master compila un catálogo a medida para el nodo.
● Una vez el nodo dispone del catálogo éste se aplica
localmente llegando hasta el estado deseado.
● Puppet Master tiene su propia interfaz para descarga
de ficheros.
puppet
master
SCM
init.pp
Binarios
Fuentes
Binarios
Fuentes
nodo
nodo
nodo
Otros
Componentes de la
infraestructura de Puppet
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
El DSL de Puppet
Lenguaje: Definición de Recursos
Recursos: elementos de un sistema operativo
File
Directory
Link
Mount
Points
Users
Groups
Hosts Packages
...
Tipos Nombres Parámetros
Recursos
file { "/etc/hosts":
ensure => present,
owner => root,
group => root,
mode => 0644
}
package {
"openjdk-6-jdk":
ensure => present,
provider => apt,
}
user {
"scarter":
ensure => present,
uid => 1000,
gid => 1000,
managehome => true,
"operator":
ensure => absent,
}
cron { "logrotate":
command =>
"/usr/sbin/logrotate",
user => root,
hour => ['2-4'],
minute => '*/10'
}
Recursos: Paquetes y versiones
package {
"openjdk-6-jdk":
ensure => "present",
provider => apt,
}
package {
"openjdk-6-jdk":
ensure => "6b22-1.10.6-0ubuntu1",
provider => apt,
}
package {
"openjdk-6-jdk":
ensure => "latest",
provider => apt,
}
Instalar ....
.... esta versión ...
.... o ir a la última!
Recursos: Tipos y Proveedores
service {
"mongodb":
ensure => running,
provider => debian,
}
type: service
parameters: {
name, path,
ensure, enable,
hasrestart,hasstatus,
pattern, ...
}
providers: {
base, bsd, daemontools
debian, freebsd, gentoo
init, launchd, redhat
runit, smf, src, ...
}
Recursos: Genéricos
Sirven tanto para un roto...
exec { "install glassfish":
require => [Package["unzip"],User["glassfish"],File["upload
glassfish"]],
command => "unzip /var/tmp/glassfish-3.1.1.zip",
cwd => "/opt",
user => "glassfish",
creates => "/opt/glassfish3",
path => ['/bin','/usr/bin','/usr/sbin']
}
Recursos: Genéricos
... como para un descosido
exec { "add jdbc-connection-pool":
require => File["/opt/glassfish3/glassfish/lib"],
command => "asadmin create-jdbc-connection-pool 
--datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource 
--restype javax.sql.DataSource
--property User=glassfish:Password=$mysql_password:
Url="jdbc:mysql://localhost:3306/test":
ZeroDateTimeBehavior=convertToNull DataChannelPool",
path => "/opt/glassfish3/bin",
}
exec { "add jdbc-resource":
require => Exec["add jdbc-connection-pool"],
command => "asadmin create-jdbc-resource 
--connectionpoolid JotadebecePool jdbc/data",
path => "/opt/glassfish3/bin",
}
Variables, Facts,
Condiciones y
Parámetros
Variables
Variables personalizadas definidas en los manifests
Relativa
$version = "3.1.1"
Global (concepto: 'namespaces' y 'namespace raíz' $::)
$::version = "3.1.1"
De clase (namespace = clase::subclase::variable)
$glassfish::params::version = "3.1.1"
External lookups
Son siempre personalizados. Permiten definir los valores de una
variable personalizada consultando datos externos (un CSV, MySQL, etc).
Variables de sistema (obtenidas mediante facter, siempre globales)
$hostname, $architecture, $memorysize, $memoryfree,...
Variables
Personalizadas
$openfire = "openfire_3_7_1.tar.gz"
file { "/var/tmp/$openfire":
ensure => present,
owner => "root",
group => "root",
mode => 644,
source => "puppet:///modules/openfire/$openfire"
}
Facts
De sistema
Afirmación: "kernelversion es un fact"
facter: programa auxiliar que recolecta y muestra información (facts)
relativa al sistema.
Ej: facter kernelversion
2.6.32
Puppet accede a estas variables (facts) para usarlas en las definiciones, como
valores para asignar o para usarlas en las condiciones de puppet. Los facts
pueden extenderse creando tus propios ... "custom facts".
Condiciones
Sentencia if-elsif-else:
if condición { bloque }
elsif condición { bloque }
else { bloque }
if ($hostname == "calypso") {
file{ "/home/user/.m2/settings.xml":
require => File["/home/user/.m2"],
ensure => "present",
mode => "644",
source => "puppet:///modules/maven/settings.xml";
}
}
Condiciones
Sentencia case:
case variable {
valor1: { bloque }
valor2: { bloque }
}
case $architecture {
x86_64,amd64: {
$arch = 'x64'
}
i386,i486,i586,i686: {
$arch = 'i586'
}
}
Condiciones
Sentencia selector:
$variable = $fact ? {
valor1 => 'y',
valor2 => 'z',
default => 'x',
}
$arch = $architecture ? {
x86_64,amd64 => 'x64',
i386,i486,i586,i686 => 'i586',
default => 'noarch',
}
}
Parámetros
Te permiten diseñar módulos genericos que sirven para diferentes tipos de
servidor sin harcodear hostnames dentro de los manifests. Un ejemplo de
cómo NO hacerlo:
class sysctl {
case $hostname ? {
'database1.localdomain': {
file { "/etc/sysctl.conf":
source => "puppet:///sysctl/etc/sysctl.conf.database",
}
}
}
}
node database1.localdomain { include sysctl }
Parámetros
Una forma más limpia de hacerlo (no me atrevo a decir que la correcta):
class sysctl ( $server_role = 'default' ) {
file { "/etc/sysctl.conf":
source => "puppet:///sysctl/etc/sysctl.conf.$server_role",
}
}
node database1.localdomain {
class { 'sysctl': server_role => 'database' }
}
node frontend1.localdomain {
class { 'sysctl': server_role => 'frontend' }
}
Nodos, Clases y Módulos
Nodos
Puppet describe la configuración de un nodo, definiendo los recursos y sus
parámetros, en ficheros llamados
manifiestos (manifests o ficheros
*.pp).
Un nodo se referencia por ...
● un nombre estático
'bm.ovh.net'
● una expresión regular
/^bm..*$/
node '*.ovh.net' {
user { 'paquito':
ensure => present,
uid => 2000,
gid => 2000,
home => '/home/paquito',
managehome => true,
shell => '/bin/zsh',
require => [Package['zsh'],Group['fulanito']],
}
group { 'fulanito':
ensure => present,
gid => 2000,
}
package { 'zsh':
ensure => present,
}
}
Nodos
En un nodo puede definirse toda la
configuración que necesite esa máquina.
No es lo más elegante, pero funciona.
Si quieres hacerlo elegante y mantenible,
necesitarás definir roles y trabajar con
diferentes clases.
Clases
node '*.ovh.net' {
user { 'paquito':
ensure => present,
uid => 2000,
gid => 2000,
home => '/home/paquito',
managehome => true,
shell => '/bin/zsh',
require => [Package['zsh'],Group['fulanito']],
}
group { 'fulanito':
ensure => present,
gid => 2000,
}
package { 'zsh':
ensure => present,
}
}
class usuarios {
user { 'paquito':
ensure => present,
uid => 2000,
gid => 2000,
home => '/home/paquito',
managehome => true,
shell => '/bin/zsh',
require => [Package['zsh'],Group['fulanito']],
}
group { 'fulanito':
ensure => present,
gid => 2000,
}
}
class zsh {
package { 'zsh':
ensure => present,
}
}
node '*.ovh.net' {
include usuarios, zsh
}
Clases
Las clases sólo definen lo que debe llevar el
sistema, para complementar estas definiciones,
se necesitan ficheros, binarios, scripts, etc.
Para estructurar una clase y sus herramientas
auxiliares se definen los módulos.
Módulos
Puppet define módulos como:
"re-usable bundles of code and data"
Contienen clases, binarios, imágenes, scripts,
tests, incluso código adicional para extender
las funcionalidades de puppet.
Módulos
/etc/puppet/
manifests/
site.pp <== Definiciones Generales
nodes.pp <== Definiciones de Nodos
modules/
foo/
manifests/
init.pp <== Definición de la Clase
foo.pp <== SubClase (foo::foo)
files/
foo.jar <== Ficheros
lib/
facter/
foo.rb <== "facts" personalizados
lib/
puppet/
foo.rb <== Extensión de Puppet
Relaciones de Orden
Relaciones entre recursos
Puppet es declarativo, lo que importa es el
final. El orden es cuestión de relaciones entre
recursos, no de posición en un fichero de
manifest.
Es responsabilidad nuestra establecer las
relaciones entre recursos y controlar el orden
de ejecución.
Referencias a Recursos
Relaciones entre recursos
Recurso Referencia y Genéricos
user User
file File
package Package
exec Exec
... ...
Relaciones entre recursos
before (antes) y require (después)
notify (publisher) y subscribe (subscriber)
File before Exec
Exec require File
File notify Exec
Exec subscribe File
Relaciones entre recursos
Ejemplo del fichero modules/sysctl/manifests/init.pp donde desplegamos un
fichero y solo si este cambia se ejecuta un comando.
class sysctl ( $server_role = 'default' ) {
file { "/etc/sysctl.conf":
source => "puppet:///sysctl/etc/sysctl.conf.$server_role",
}
exec { "reload_sysctl":
command => "/sbin/sysctl -p",
refreshonly => true,
returns => [ 0,255 ],
subscribe => File["/etc/sysctl.conf"],
require => File["/etc/sysctl.conf"],
}
}
Relaciones entre recursos
Ejemplo del fichero modules/sysctl/manifests/init.pp donde desplegamos un
fichero y solo si este cambia se ejecuta un comando.
class sysctl ( $server_role = 'default' ) {
file { "/etc/sysctl.conf":
source => "puppet:///sysctl/etc/sysctl.conf.$server_role",
notify => File["/etc/sysctl.conf"],
}
exec { "reload_sysctl":
command => "/sbin/sysctl -p",
refreshonly => true,
returns => [ 0,255 ],
require => File["/etc/sysctl.conf"],
}
}
Relaciones entre recursos
Ejemplo del fichero modules/rsync/manifests/server.pp donde algunos ficheros
solo se despliegan en sistemas Debian, y han de desplegarse antes de
levantar el servicio.
class rsync ( $server_role = 'default' ) {
case $operatingsystem {
Debian: {
file { "$rsync_default_config":
content =>
template("rsync/etc/default/rsync.erb.$server_role"),
notify => Service["$rsync"],
before => Service["$rsync"],
}
}
}
Relaciones entre recursos
Podemos crear stages que funcionan como
containers para tener un arbol de
dependencias más limpio.
stage { "boot": before => Stage["os"] }
stage { "service": }
stage { "os": before => Stage["service"] }
stage { "online": require => Stage["service"] }
class { 'apt': stage => 'boot' }
class { 'rsyslog': stage => 'os' }
class { 'zabbix': stage => 'os' }
class { 'nginx': conf_role => 'default', vhost_role => 'f00', stage => 'service'}
Enough!
Vamos a por la chicha
( y sí, nos saltamos los templates )
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
Primeros pasos con
Puppet
Instalación y práctica
Instalación
Por paquetería
# apt-get install puppet
# yum install puppet
Verificar las versiones de puppet (2.7.x recomendado)
También se puede descargar el código fuente. Mejor leer
la documentación para ello.
Uso: Primeros pasos
# facter
Uso: Primeros pasos
# puppet help
Uso: Primeros pasos
# puppet describe [-h] [-l] [-p]
Uso: Primeros pasos
# puppet resource user root
# pupet resource user
# puppet resource package
# puppet resource service
Uso: Primeros pasos
# puppet resource package zsh ensure=latest
# puppet resource user paquito ensure=present
managehome=true shell=/bin/zsh
Uso: Primeros pasos
# vi init.pp
node 'bm.ovh.net' {
user { 'paquito':
ensure => present,
uid => 2000,
gid => 2000,
home => '/home/paquito',
managehome => true,
shell => '/bin/zsh',
require => [Package['zsh'],Group['fulanito']],
}
group { 'fulanito':
ensure => present,
gid => 2000,
}
package { 'zsh':
ensure => present,
}
}
# puppet apply init.pp
Con esto ya se puede trabajar.
Agrégale un repositorio de código o un servidor
de ficheros (SMB o NFS) y una entrada en el
crontab, y ya tienes una gestión de la
configuración mínima.
Y ahora... Master of
Puppets!
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
Puppet Master
● Compila el catálogo y parsea las templates
para los nodos.
● Ofrece una PKI completa para emitir
certificados SSL a los nodos. Gestiona su
autenticación.
● Habilita la transferencia y backup de ficheros
(puppet:/// y filebucket)
Puppet Master
● Suele ser el encargado de servir los ficheros
a los agentes.
● Suele ser el encargado de recibir y procesar
informes de los nodos.
● Se recomienda utilizar Passenger con
NGiNX o Apache y a ser posible Ruby
Enterprise para un mejor rendimiento.
Cómo funciona el puppet master?
A nivel plataforma es una aplicación web (puerto HTTP
8140) con autenticación SSL de cliente.
Puppetmaster corre sobre Webrick (un servidor web usado
en rails), aunque también puede correr sobre
{apache|nginx} + (passenger|mongrel).
Al ser web, es ampliamente escalable: sólo tienes que
añadir más:
Balanceadores
Balanceadores
Sistemas de
ficherosSistemas de
ficherosSistemas de
ficheros
Balanceadores
Nodos
Nodos
Otros:
BBDD
LDAP
Otros:
BBDD
LDAP
Instalación del servidor
Por paquetería
# apt-get install puppetmaster
# yum install puppet-server
También se puede descargar el código fuente. Mejor leer
la documentación para ello.
Puppet Master: Entornos
Concepto:
Entorno es una agrupación de recursos a
desplegar en un conjunto de nodos de forma
estructural.
● Elemento de la configuración del master
● Permite mantener distintas versiones de
recursos en directorios separados
● Permite mantener distintos proyectos
separados en el mismo servidor puppet
● Por defecto: production.
● Se aplican con la opción --environment
puppet
master
[development] [production]
recurso
v1.2recurso
v1.2
recurso
v1.2recurso
v1
Puppet Master: CA
Puppet incorpora una CA para reconocer a
todos los nodos que gestiona.
=> el nombre del nodo se extrae del certificado
=> el nodo genera el CSR y puppetmaster
firma el certificado
=> para que funcione, el cliente y el servidor
deben de estar sincronizados (fallo de SSL)
=> un nodo no puede cambiar de nombre una
vez configurado. (necesita borrado de .pem)
=> la CA está basada en openssl y es sencilla
Puppet Master: CA
[nodo]#: puppet agent --test --onetime
[puppet]#: puppet cert list [--all]
[puppet]#: puppet cert sign nodo
[nodo]#: puppet agent --test --onetime
Puppet Master: CA
Gestión de la CA
A través de comandos:
A) puppet cert
B) puppetca (es lo mismo, aunque se está
deprecando)
Puppet @ abstra·cc
puppet
node1
Mercurialpull
sysadmin
Catalog
run
Apache +
Passenger
push
node1
node1prod
nodes
node1
node1
node1dev
nodes
BBDD
storeconfig store
Puppet Master @ abstra·cc
● SCM: mercurial
● puppet: pull data from SCM
● puppet:
○ CA master
○ RDBMS: store config en MySQL
CA
Invalidation
Catalog
Reports
Puppet @ Tuenti
puppet1
(NGINX +
Passenger)
puppet2
(NGINX +
Passenger)
HAProxy
node1
SCMpull
sysadmin /
developer
pdash1
(NGINX +
Passenger)
push
Catalog
run
node1
node1
node1
node00
Puppet Master @ Tuenti
● SCM: svn, git, mercurial
● puppet1/puppet2: hacen pull del SCM.
Ambos atienden peticiones de catálogo.
Podemos utilizar cuantos queramos.
● puppet1: CA master. los certificados son
preferiblemente emitidos por ella y
replicados a otros masters.
● puppet1: servicio de invalidación de CA,
igual que el anterior.
● pdash1: reports (interfaz web y trabajos
batch)
Y hasta aquí por hoy...
Nos quedan todavía muchas cosas que
contar, pero vendrán más adelante.
Para la próxima
charla/taller
Cosas que nos gustaría ver.
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
Componentes de puppet
Lenguaje Facter
Puppet
agent
Puppet
Master
Consolas
External
Node
Classifiers
Store
Configs
Marionette
Collective
Nivel fácil
Nivel
Intermedio
Nivel
Avanzado
Nivel Experto
Referencias
Libros
Enlaces
Multimedia
Referencias
● [URL] Puppet Labs: http://docs.puppetlabs.com/
○ puppet.pdf y learning puppet vm
● [Libro] Pro Puppet: http://goo.gl/j2yat
● [Grupos] Puppet users: http://groups.google.com/group/puppet-users
● [Presentación] PyCon2011: http://rcrowley.org/talks/pycon-2011/
● [Presentación] Extending Puppet:
http://rcrowley.org/talks/sv-puppet-2011-01-11
● [Utilidad] Gepetto: https://github.com/cloudsmith/geppetto

Más contenido relacionado

La actualidad más candente

Acceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletAcceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletjubacalo
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbcjbersosa
 
Servicio web java php perl google
Servicio web  java php perl googleServicio web  java php perl google
Servicio web java php perl googleSeveredDRA
 
Vistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de SistemasVistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de SistemasJose Bustamante Romero
 
HackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHillmerC
 
Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Diego Montiel
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCCarlos Hernando
 
gestion de datos de informacion
gestion de datos de informaciongestion de datos de informacion
gestion de datos de informacionPedro Kent
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
Slides components en
Slides components enSlides components en
Slides components enJavier López
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009Irontec
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Alejandro E Brito Monedero
 

La actualidad más candente (18)

Acceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletAcceso a BBDD mediante un servlet
Acceso a BBDD mediante un servlet
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 
Servicio web java php perl google
Servicio web  java php perl googleServicio web  java php perl google
Servicio web java php perl google
 
Vistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de SistemasVistas y Base de Datos - Analisis de Sistemas
Vistas y Base de Datos - Analisis de Sistemas
 
Mysql
MysqlMysql
Mysql
 
HackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHackDay Java 9 Spanish version
HackDay Java 9 Spanish version
 
Sql connection
Sql connectionSql connection
Sql connection
 
Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1
 
Objeto sqlcommand
Objeto sqlcommandObjeto sqlcommand
Objeto sqlcommand
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
gestion de datos de informacion
gestion de datos de informaciongestion de datos de informacion
gestion de datos de informacion
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Slides components en
Slides components enSlides components en
Slides components en
 
Integración LDAP - OTRS
Integración LDAP - OTRSIntegración LDAP - OTRS
Integración LDAP - OTRS
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
Cganen1 6 c luster
Cganen1 6 c lusterCganen1 6 c luster
Cganen1 6 c luster
 
Sql dataadapter
Sql dataadapterSql dataadapter
Sql dataadapter
 

Destacado

Entornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetEntornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetVicent Soria Durá
 
Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet
Virtualización y  Provisionamiento: Entornos de desarrollo con  Vagrant y PuppetVirtualización y  Provisionamiento: Entornos de desarrollo con  Vagrant y Puppet
Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y PuppetRichard Moya
 
Curso puppet lenguaje_2
Curso puppet lenguaje_2Curso puppet lenguaje_2
Curso puppet lenguaje_2martacdehesa
 
Puppet for Security Compliance - GOSCON 2010
Puppet for Security Compliance - GOSCON 2010Puppet for Security Compliance - GOSCON 2010
Puppet for Security Compliance - GOSCON 2010Puppet
 
Package your Java EE Application using Docker and Kubernetes
Package your Java EE Application using Docker and KubernetesPackage your Java EE Application using Docker and Kubernetes
Package your Java EE Application using Docker and KubernetesArun Gupta
 

Destacado (6)

Entornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppetEntornos de desarrollo para symfony2 con vagrant y puppet
Entornos de desarrollo para symfony2 con vagrant y puppet
 
Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet
Virtualización y  Provisionamiento: Entornos de desarrollo con  Vagrant y PuppetVirtualización y  Provisionamiento: Entornos de desarrollo con  Vagrant y Puppet
Virtualización y Provisionamiento: Entornos de desarrollo con Vagrant y Puppet
 
Gestionando servidores con Puppet
Gestionando servidores con PuppetGestionando servidores con Puppet
Gestionando servidores con Puppet
 
Curso puppet lenguaje_2
Curso puppet lenguaje_2Curso puppet lenguaje_2
Curso puppet lenguaje_2
 
Puppet for Security Compliance - GOSCON 2010
Puppet for Security Compliance - GOSCON 2010Puppet for Security Compliance - GOSCON 2010
Puppet for Security Compliance - GOSCON 2010
 
Package your Java EE Application using Docker and Kubernetes
Package your Java EE Application using Docker and KubernetesPackage your Java EE Application using Docker and Kubernetes
Package your Java EE Application using Docker and Kubernetes
 

Similar a Presentación charla puppet madrid devops 2012

Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Asier Marqués
 
Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magentoOnestic
 
Sysmana 2017 monitorización de logs con el stack elk
Sysmana 2017   monitorización de logs con el stack elkSysmana 2017   monitorización de logs con el stack elk
Sysmana 2017 monitorización de logs con el stack elkJosé Ignacio Álvarez Ruiz
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetosJorge Ercoli
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con HibernateMauro Gomez Mejia
 
Explicacion de la Clase en Java-MySQL.pdf
Explicacion de la Clase en Java-MySQL.pdfExplicacion de la Clase en Java-MySQL.pdf
Explicacion de la Clase en Java-MySQL.pdfGregorioSnchez7
 
Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Ciencias
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Ronald Cuello
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytestHector Canto
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Oracle Coherence (by Leonardo Torres Altez)
Oracle Coherence (by Leonardo Torres Altez)Oracle Coherence (by Leonardo Torres Altez)
Oracle Coherence (by Leonardo Torres Altez)barcelonajug
 
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptxGabriela Soto
 

Similar a Presentación charla puppet madrid devops 2012 (20)

Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Rendimiento en magento
Rendimiento en magentoRendimiento en magento
Rendimiento en magento
 
Sysmana 2017 monitorización de logs con el stack elk
Sysmana 2017   monitorización de logs con el stack elkSysmana 2017   monitorización de logs con el stack elk
Sysmana 2017 monitorización de logs con el stack elk
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Explicacion de la Clase en Java-MySQL.pdf
Explicacion de la Clase en Java-MySQL.pdfExplicacion de la Clase en Java-MySQL.pdf
Explicacion de la Clase en Java-MySQL.pdf
 
Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Hablemos de Systemd
Hablemos de SystemdHablemos de Systemd
Hablemos de Systemd
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Jdbc
JdbcJdbc
Jdbc
 
SEVILLA Meetups23032023.pdf
SEVILLA Meetups23032023.pdfSEVILLA Meetups23032023.pdf
SEVILLA Meetups23032023.pdf
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Oracle Coherence (by Leonardo Torres Altez)
Oracle Coherence (by Leonardo Torres Altez)Oracle Coherence (by Leonardo Torres Altez)
Oracle Coherence (by Leonardo Torres Altez)
 
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
[Shared] ML Bootcamp - GDG Barcelona - Semana 4.pptx
 

Presentación charla puppet madrid devops 2012

  • 1. Gestión de la Configuración con - Puppet - @jmoratilla @ricbartm@madrid_devops
  • 2. Indice Introducción > Qué es puppet? > Cómo lo hace? Componentes > Lenguaje > Puppet client > Puppet Master Puppet @ abstra Puppet @ tuenti @jmoratilla @ricbartm Ponentes
  • 3.
  • 4. Qué es puppet? -- Sistema de gestión de la configuración ++ claaaroo... ¿Y eso para qué sirve? -- Sirve para configurar y mantener un grupo de máquinas, todas iguales, de forma fácil y sencilla. ++ Ya! y algo más? -- Permite actualizar automáticamente la configuración de las máquinas, y auditarlas. ++ Ok.
  • 5. Por qué puppet? Consistencia y flexibilidad ● La configuración manual no es recomendable. Errores humanos. ● Las "Golden Images" son un quebradero de cabeza.
  • 6. Por qué puppet? Consistencia y flexibilidad ● La configuración y el mantenimiento se realiza desde un control central. ● Permite reproducir configuraciones completas en caso de desastre (10th floor test).
  • 7. Por qué puppet? Consistencia y flexibilidad ● Roles, clases y nodos: misma definición, misma configuración, o no ;) ● Un agente corre cada 30 minutos: cada 30 minutos se comprueba que todo está en su sitio, y si no, se vuelve a poner en su sitio.
  • 8. Por qué puppet? Operativa ● La curva de aprendizaje y el <grin> "Time To Market" </grin> son muy cortos. ● Toda la lógica de configuración bajo Puppet: permite que cualquiera lo lea y entienda sin tener que indagar. ● No más páginas horribles explicando cómo configurar algo. Céntrate en el servicio en sí.
  • 9. Por qué puppet? Portabilidad ● La configuración, al ser reproducible, permite llevar el servicio a una nube privada, pública, o a un entorno de pruebas aislado con facilidad. ● Si los módulos están bien escritos, no debería importar mucho si se trata de Debian, Ubuntu, CentOS o RHEL.
  • 10. Cómo lo hace? Tecnología ● Basado en lenguaje ruby. ● Utiliza un lenguaje específico de dominio (DSL) orientado a "recursos" Recursos? Comandos, Usuarios, Ficheros, Paquetes de software, Servicios, Configuraciones específicas, etc.
  • 11. Cómo lo hace? La práctica: Stand Alone (puppet apply) ● El programa (agente) accede a unos ficheros de definición (.pp) ● Verifica si el estado de los recursos indicados en el fichero coinciden con la situación actual. ● Si todo es correcto, aplica los cambios hasta coincidir con lo indicado en el fichero de definición. nodo SCM init.pp Binarios Fuentes
  • 12. Cómo lo hace? La práctica: Servidor (puppetmaster) ● El cliente (agente) conecta al master y le envía información de sí mismo. Parte de esa información podría ser reutilizada para generar el catálogo (IP, hostname, etc). ● El master compila un catálogo a medida para el nodo. ● Una vez el nodo dispone del catálogo éste se aplica localmente llegando hasta el estado deseado. ● Puppet Master tiene su propia interfaz para descarga de ficheros. puppet master SCM init.pp Binarios Fuentes Binarios Fuentes nodo nodo nodo Otros
  • 13.
  • 15. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 16. El DSL de Puppet
  • 17. Lenguaje: Definición de Recursos Recursos: elementos de un sistema operativo File Directory Link Mount Points Users Groups Hosts Packages ... Tipos Nombres Parámetros
  • 18. Recursos file { "/etc/hosts": ensure => present, owner => root, group => root, mode => 0644 } package { "openjdk-6-jdk": ensure => present, provider => apt, } user { "scarter": ensure => present, uid => 1000, gid => 1000, managehome => true, "operator": ensure => absent, } cron { "logrotate": command => "/usr/sbin/logrotate", user => root, hour => ['2-4'], minute => '*/10' }
  • 19. Recursos: Paquetes y versiones package { "openjdk-6-jdk": ensure => "present", provider => apt, } package { "openjdk-6-jdk": ensure => "6b22-1.10.6-0ubuntu1", provider => apt, } package { "openjdk-6-jdk": ensure => "latest", provider => apt, } Instalar .... .... esta versión ... .... o ir a la última!
  • 20. Recursos: Tipos y Proveedores service { "mongodb": ensure => running, provider => debian, } type: service parameters: { name, path, ensure, enable, hasrestart,hasstatus, pattern, ... } providers: { base, bsd, daemontools debian, freebsd, gentoo init, launchd, redhat runit, smf, src, ... }
  • 21. Recursos: Genéricos Sirven tanto para un roto... exec { "install glassfish": require => [Package["unzip"],User["glassfish"],File["upload glassfish"]], command => "unzip /var/tmp/glassfish-3.1.1.zip", cwd => "/opt", user => "glassfish", creates => "/opt/glassfish3", path => ['/bin','/usr/bin','/usr/sbin'] }
  • 22. Recursos: Genéricos ... como para un descosido exec { "add jdbc-connection-pool": require => File["/opt/glassfish3/glassfish/lib"], command => "asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --restype javax.sql.DataSource --property User=glassfish:Password=$mysql_password: Url="jdbc:mysql://localhost:3306/test": ZeroDateTimeBehavior=convertToNull DataChannelPool", path => "/opt/glassfish3/bin", } exec { "add jdbc-resource": require => Exec["add jdbc-connection-pool"], command => "asadmin create-jdbc-resource --connectionpoolid JotadebecePool jdbc/data", path => "/opt/glassfish3/bin", }
  • 24. Variables Variables personalizadas definidas en los manifests Relativa $version = "3.1.1" Global (concepto: 'namespaces' y 'namespace raíz' $::) $::version = "3.1.1" De clase (namespace = clase::subclase::variable) $glassfish::params::version = "3.1.1" External lookups Son siempre personalizados. Permiten definir los valores de una variable personalizada consultando datos externos (un CSV, MySQL, etc). Variables de sistema (obtenidas mediante facter, siempre globales) $hostname, $architecture, $memorysize, $memoryfree,...
  • 25. Variables Personalizadas $openfire = "openfire_3_7_1.tar.gz" file { "/var/tmp/$openfire": ensure => present, owner => "root", group => "root", mode => 644, source => "puppet:///modules/openfire/$openfire" }
  • 26. Facts De sistema Afirmación: "kernelversion es un fact" facter: programa auxiliar que recolecta y muestra información (facts) relativa al sistema. Ej: facter kernelversion 2.6.32 Puppet accede a estas variables (facts) para usarlas en las definiciones, como valores para asignar o para usarlas en las condiciones de puppet. Los facts pueden extenderse creando tus propios ... "custom facts".
  • 27. Condiciones Sentencia if-elsif-else: if condición { bloque } elsif condición { bloque } else { bloque } if ($hostname == "calypso") { file{ "/home/user/.m2/settings.xml": require => File["/home/user/.m2"], ensure => "present", mode => "644", source => "puppet:///modules/maven/settings.xml"; } }
  • 28. Condiciones Sentencia case: case variable { valor1: { bloque } valor2: { bloque } } case $architecture { x86_64,amd64: { $arch = 'x64' } i386,i486,i586,i686: { $arch = 'i586' } }
  • 29. Condiciones Sentencia selector: $variable = $fact ? { valor1 => 'y', valor2 => 'z', default => 'x', } $arch = $architecture ? { x86_64,amd64 => 'x64', i386,i486,i586,i686 => 'i586', default => 'noarch', } }
  • 30. Parámetros Te permiten diseñar módulos genericos que sirven para diferentes tipos de servidor sin harcodear hostnames dentro de los manifests. Un ejemplo de cómo NO hacerlo: class sysctl { case $hostname ? { 'database1.localdomain': { file { "/etc/sysctl.conf": source => "puppet:///sysctl/etc/sysctl.conf.database", } } } } node database1.localdomain { include sysctl }
  • 31. Parámetros Una forma más limpia de hacerlo (no me atrevo a decir que la correcta): class sysctl ( $server_role = 'default' ) { file { "/etc/sysctl.conf": source => "puppet:///sysctl/etc/sysctl.conf.$server_role", } } node database1.localdomain { class { 'sysctl': server_role => 'database' } } node frontend1.localdomain { class { 'sysctl': server_role => 'frontend' } }
  • 32. Nodos, Clases y Módulos
  • 33. Nodos Puppet describe la configuración de un nodo, definiendo los recursos y sus parámetros, en ficheros llamados manifiestos (manifests o ficheros *.pp). Un nodo se referencia por ... ● un nombre estático 'bm.ovh.net' ● una expresión regular /^bm..*$/ node '*.ovh.net' { user { 'paquito': ensure => present, uid => 2000, gid => 2000, home => '/home/paquito', managehome => true, shell => '/bin/zsh', require => [Package['zsh'],Group['fulanito']], } group { 'fulanito': ensure => present, gid => 2000, } package { 'zsh': ensure => present, } }
  • 34. Nodos En un nodo puede definirse toda la configuración que necesite esa máquina. No es lo más elegante, pero funciona. Si quieres hacerlo elegante y mantenible, necesitarás definir roles y trabajar con diferentes clases.
  • 35. Clases node '*.ovh.net' { user { 'paquito': ensure => present, uid => 2000, gid => 2000, home => '/home/paquito', managehome => true, shell => '/bin/zsh', require => [Package['zsh'],Group['fulanito']], } group { 'fulanito': ensure => present, gid => 2000, } package { 'zsh': ensure => present, } } class usuarios { user { 'paquito': ensure => present, uid => 2000, gid => 2000, home => '/home/paquito', managehome => true, shell => '/bin/zsh', require => [Package['zsh'],Group['fulanito']], } group { 'fulanito': ensure => present, gid => 2000, } } class zsh { package { 'zsh': ensure => present, } } node '*.ovh.net' { include usuarios, zsh }
  • 36. Clases Las clases sólo definen lo que debe llevar el sistema, para complementar estas definiciones, se necesitan ficheros, binarios, scripts, etc. Para estructurar una clase y sus herramientas auxiliares se definen los módulos.
  • 37. Módulos Puppet define módulos como: "re-usable bundles of code and data" Contienen clases, binarios, imágenes, scripts, tests, incluso código adicional para extender las funcionalidades de puppet.
  • 38. Módulos /etc/puppet/ manifests/ site.pp <== Definiciones Generales nodes.pp <== Definiciones de Nodos modules/ foo/ manifests/ init.pp <== Definición de la Clase foo.pp <== SubClase (foo::foo) files/ foo.jar <== Ficheros lib/ facter/ foo.rb <== "facts" personalizados lib/ puppet/ foo.rb <== Extensión de Puppet
  • 40. Relaciones entre recursos Puppet es declarativo, lo que importa es el final. El orden es cuestión de relaciones entre recursos, no de posición en un fichero de manifest. Es responsabilidad nuestra establecer las relaciones entre recursos y controlar el orden de ejecución.
  • 41. Referencias a Recursos Relaciones entre recursos Recurso Referencia y Genéricos user User file File package Package exec Exec ... ...
  • 42. Relaciones entre recursos before (antes) y require (después) notify (publisher) y subscribe (subscriber) File before Exec Exec require File File notify Exec Exec subscribe File
  • 43. Relaciones entre recursos Ejemplo del fichero modules/sysctl/manifests/init.pp donde desplegamos un fichero y solo si este cambia se ejecuta un comando. class sysctl ( $server_role = 'default' ) { file { "/etc/sysctl.conf": source => "puppet:///sysctl/etc/sysctl.conf.$server_role", } exec { "reload_sysctl": command => "/sbin/sysctl -p", refreshonly => true, returns => [ 0,255 ], subscribe => File["/etc/sysctl.conf"], require => File["/etc/sysctl.conf"], } }
  • 44. Relaciones entre recursos Ejemplo del fichero modules/sysctl/manifests/init.pp donde desplegamos un fichero y solo si este cambia se ejecuta un comando. class sysctl ( $server_role = 'default' ) { file { "/etc/sysctl.conf": source => "puppet:///sysctl/etc/sysctl.conf.$server_role", notify => File["/etc/sysctl.conf"], } exec { "reload_sysctl": command => "/sbin/sysctl -p", refreshonly => true, returns => [ 0,255 ], require => File["/etc/sysctl.conf"], } }
  • 45. Relaciones entre recursos Ejemplo del fichero modules/rsync/manifests/server.pp donde algunos ficheros solo se despliegan en sistemas Debian, y han de desplegarse antes de levantar el servicio. class rsync ( $server_role = 'default' ) { case $operatingsystem { Debian: { file { "$rsync_default_config": content => template("rsync/etc/default/rsync.erb.$server_role"), notify => Service["$rsync"], before => Service["$rsync"], } } }
  • 46. Relaciones entre recursos Podemos crear stages que funcionan como containers para tener un arbol de dependencias más limpio. stage { "boot": before => Stage["os"] } stage { "service": } stage { "os": before => Stage["service"] } stage { "online": require => Stage["service"] } class { 'apt': stage => 'boot' } class { 'rsyslog': stage => 'os' } class { 'zabbix': stage => 'os' } class { 'nginx': conf_role => 'default', vhost_role => 'f00', stage => 'service'}
  • 47. Enough! Vamos a por la chicha ( y sí, nos saltamos los templates )
  • 48. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 50. Instalación Por paquetería # apt-get install puppet # yum install puppet Verificar las versiones de puppet (2.7.x recomendado) También se puede descargar el código fuente. Mejor leer la documentación para ello.
  • 52. Uso: Primeros pasos # puppet help
  • 53. Uso: Primeros pasos # puppet describe [-h] [-l] [-p]
  • 54. Uso: Primeros pasos # puppet resource user root # pupet resource user # puppet resource package # puppet resource service
  • 55. Uso: Primeros pasos # puppet resource package zsh ensure=latest # puppet resource user paquito ensure=present managehome=true shell=/bin/zsh
  • 56. Uso: Primeros pasos # vi init.pp node 'bm.ovh.net' { user { 'paquito': ensure => present, uid => 2000, gid => 2000, home => '/home/paquito', managehome => true, shell => '/bin/zsh', require => [Package['zsh'],Group['fulanito']], } group { 'fulanito': ensure => present, gid => 2000, } package { 'zsh': ensure => present, } } # puppet apply init.pp Con esto ya se puede trabajar. Agrégale un repositorio de código o un servidor de ficheros (SMB o NFS) y una entrada en el crontab, y ya tienes una gestión de la configuración mínima.
  • 57. Y ahora... Master of Puppets!
  • 58.
  • 59. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 60. Puppet Master ● Compila el catálogo y parsea las templates para los nodos. ● Ofrece una PKI completa para emitir certificados SSL a los nodos. Gestiona su autenticación. ● Habilita la transferencia y backup de ficheros (puppet:/// y filebucket)
  • 61. Puppet Master ● Suele ser el encargado de servir los ficheros a los agentes. ● Suele ser el encargado de recibir y procesar informes de los nodos. ● Se recomienda utilizar Passenger con NGiNX o Apache y a ser posible Ruby Enterprise para un mejor rendimiento.
  • 62. Cómo funciona el puppet master? A nivel plataforma es una aplicación web (puerto HTTP 8140) con autenticación SSL de cliente. Puppetmaster corre sobre Webrick (un servidor web usado en rails), aunque también puede correr sobre {apache|nginx} + (passenger|mongrel). Al ser web, es ampliamente escalable: sólo tienes que añadir más: Balanceadores Balanceadores Sistemas de ficherosSistemas de ficherosSistemas de ficheros Balanceadores Nodos Nodos Otros: BBDD LDAP Otros: BBDD LDAP
  • 63. Instalación del servidor Por paquetería # apt-get install puppetmaster # yum install puppet-server También se puede descargar el código fuente. Mejor leer la documentación para ello.
  • 64. Puppet Master: Entornos Concepto: Entorno es una agrupación de recursos a desplegar en un conjunto de nodos de forma estructural. ● Elemento de la configuración del master ● Permite mantener distintas versiones de recursos en directorios separados ● Permite mantener distintos proyectos separados en el mismo servidor puppet ● Por defecto: production. ● Se aplican con la opción --environment puppet master [development] [production] recurso v1.2recurso v1.2 recurso v1.2recurso v1
  • 65. Puppet Master: CA Puppet incorpora una CA para reconocer a todos los nodos que gestiona. => el nombre del nodo se extrae del certificado => el nodo genera el CSR y puppetmaster firma el certificado => para que funcione, el cliente y el servidor deben de estar sincronizados (fallo de SSL) => un nodo no puede cambiar de nombre una vez configurado. (necesita borrado de .pem) => la CA está basada en openssl y es sencilla
  • 66. Puppet Master: CA [nodo]#: puppet agent --test --onetime [puppet]#: puppet cert list [--all] [puppet]#: puppet cert sign nodo [nodo]#: puppet agent --test --onetime
  • 67. Puppet Master: CA Gestión de la CA A través de comandos: A) puppet cert B) puppetca (es lo mismo, aunque se está deprecando)
  • 68. Puppet @ abstra·cc puppet node1 Mercurialpull sysadmin Catalog run Apache + Passenger push node1 node1prod nodes node1 node1 node1dev nodes BBDD storeconfig store
  • 69. Puppet Master @ abstra·cc ● SCM: mercurial ● puppet: pull data from SCM ● puppet: ○ CA master ○ RDBMS: store config en MySQL
  • 70. CA Invalidation Catalog Reports Puppet @ Tuenti puppet1 (NGINX + Passenger) puppet2 (NGINX + Passenger) HAProxy node1 SCMpull sysadmin / developer pdash1 (NGINX + Passenger) push Catalog run node1 node1 node1 node00
  • 71. Puppet Master @ Tuenti ● SCM: svn, git, mercurial ● puppet1/puppet2: hacen pull del SCM. Ambos atienden peticiones de catálogo. Podemos utilizar cuantos queramos. ● puppet1: CA master. los certificados son preferiblemente emitidos por ella y replicados a otros masters. ● puppet1: servicio de invalidación de CA, igual que el anterior. ● pdash1: reports (interfaz web y trabajos batch)
  • 72. Y hasta aquí por hoy... Nos quedan todavía muchas cosas que contar, pero vendrán más adelante.
  • 73. Para la próxima charla/taller Cosas que nos gustaría ver.
  • 74. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 75. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 76. Componentes de puppet Lenguaje Facter Puppet agent Puppet Master Consolas External Node Classifiers Store Configs Marionette Collective Nivel fácil Nivel Intermedio Nivel Avanzado Nivel Experto
  • 78. Referencias ● [URL] Puppet Labs: http://docs.puppetlabs.com/ ○ puppet.pdf y learning puppet vm ● [Libro] Pro Puppet: http://goo.gl/j2yat ● [Grupos] Puppet users: http://groups.google.com/group/puppet-users ● [Presentación] PyCon2011: http://rcrowley.org/talks/pycon-2011/ ● [Presentación] Extending Puppet: http://rcrowley.org/talks/sv-puppet-2011-01-11 ● [Utilidad] Gepetto: https://github.com/cloudsmith/geppetto