1. Dani Gutiérrez Porset
dani@f4kt.com
para el Grupo SOPRA
Vitoria-Gasteiz, Dic-2013
Curso de Puppet:Curso de Puppet:
Lenguaje de configuración (2/2)Lenguaje de configuración (2/2)
2. Curso de Puppet – Lenguaje de configuración
2
Licencia y ReferenciasLicencia y Referencias
● Autor: Dani Gutiérrez
● Licencia: Copyright
● Imágenes referenciadas o diseñadas por el autor. Logotipos y
marcas pertenecientes a sus respectivas organizaciones
● Esta presentación se ha realizado gracias al software libre
GNU/Linux, KDE, LibreOffice, Firefox, Chromium, Inkscape,
Gimp, Gwenview, Ksnapshot
● Referencias:
● Libro "Pro Puppet" de James Turnbull y Jeffrey McCune – Ed.
2011
●
http://puppetlabs.com
3. Curso de Puppet – Lenguaje de configuración
3
ÍndiceÍndice
● Resumen de elementos de configuraciones
● Manifiestos y Catálogos
● Nodos
● Módulos
● Clases. Herencia. Definición y declaración
● Recursos. Recursos por defecto. Referencias a recursos.
Dependencias entre recursos. Tipos de recursos definidos.
Tipos de recursos custom. Recursos virtuales. Recolectores de
recursos. Recursos exportados
● Etiquetas
4. Curso de Puppet – Lenguaje de configuración
4
Resumen de ElementosResumen de Elementos
para definir configuracionespara definir configuraciones
● Elementos de lenguaje:
●
Recursos: elementos básicos de configuración
●
Clases: conjuntos de recursos relacionados
●
Nodos: especificación de la configuración de cada
nodo
● Ficheros y directorios:
●
Módulos: colecciones portables de manifests
●
Ficheros: se envían a los agentes
●
Plantillas: ficheros que se usan para generar otros
ficheros
5. Curso de Puppet – Lenguaje de configuración
5
ManifiestosManifiestos
● Son ficheros de código fuente con extensión .pp
● Formato:
● Es recomendable que lleven codificación UTF8
● Saltos de línea con LF o CR LF
● Pueden incluir otros ficheros de $confdir/manifests/:
import 'nombrefichero_con_o_sin_punto_pp'
import 'carpeta/*'
6. Curso de Puppet – Lenguaje de configuración
6
CatálogosCatálogos
● Un catálogo es uno o varios manifiestos compilados.
Manifestos y catálogos contienen recursos y relaciones
● Cada catálogo es válido para un nodo
● En los agentes se quedan cacheados
● Físicamente es un documento que no tiene una
especificación de formato concreta, pero puede estar:
● En memoria, como un objeto Ruby
● En la red en formato JSON
● En el disco duro en formato YAML
7. Curso de Puppet – Lenguaje de configuración
7
NodosNodos
● El tratamiento de un host o nodo se realiza asociando código
proveniente de dos orígenes:
● De la definición del nodo
● De código externo
● El elemento nodo establece un nuevo ámbito en el que se
pueden sobreescribir variables y valores por defecto del
ámbito superior
● Un nodo puede heredar de otros nodos, de forma idéntica a las
clases, pero no se recomienda
8. Curso de Puppet – Lenguaje de configuración
8
Nodos y fichero site.ppNodos y fichero site.pp
● Definición en fichero site.pp:
● La definición de nodos ha de estar en site.pp pero desde éste se pueden
importar, ej:
import super_nodo.pp
import nodos/*.pp
● Si site.pp contiene alguna definición de nodo, entonces todos los nodos han
de poder referenciarse desde dicho fichero. Útil para este caso: default
● Aunque el nombre de un nodo se encuentre en varias definiciones, sólo se aplica un
único caso en este orden:
● Búsqueda del nombre exacto
● Primera expresión regular encontrada
● Si es un fqdn, se va eliminando cada zona desde la derecha
● Uso de la definición default
9. Curso de Puppet – Lenguaje de configuración
9
Nodos: definiciónNodos: definición
● Sintaxis:
node 'identificador' {
... # declaración de clases, variables,...
}
● Se puede definir más de un nodo: node 'nodo1','nodo2',... {
● Notas sobre el identificador:
● Suele ser el fqdn, ej: nodo1.acme.com
● Se admiten además:
– Sentencias regulares, ej: node /^wwwd+$/ {...
– default: aplica a los nodos para los que no se encuentra
identificador
10. Curso de Puppet – Lenguaje de configuración
10
MódulosMódulos
● Agrupación independiente de recursos, clases, definiciones, ficheros
y plantillas
● Todos los manifiestos pertenecen a algún nodo a excepción del
site.pp que sería el global
● Los módulos se cargan de directorios indicados en la variable de
configuración $modulepath
● Modulos de interés en https://forge.puppetlabs.com/
● Reglas sobre el nombre:
● Comienza con minúscula y puede contener minúsculas, números y _
● El nombre puede hacer referencia a espacios de nombres con ::
Ej:
espacio1::espacio2:: ... ::clase1
11. Curso de Puppet – Lenguaje de configuración
11
Módulos:Módulos:
Carpetas típicasCarpetas típicas
● Carpeta de módulo tiene debajo unos subdirectorios estándar
● files
● manifests
● templates
● lib: contiene plugins (ej. Facts y tipos de recurso customizados)
● tests: ejemplos sobre cómo declarar las clases y los tipos definidos
de módulos
● spec: pruebas para los plugins de lib/
12. Curso de Puppet – Lenguaje de configuración
12
Espacios de nombresEspacios de nombres
● Hace referencia a los subdirectorios bajo la carpeta de
módulos en los que se encuentran las Clases y los Tipos
definidos
● Se usa :: para separar de forma análoga al /
● Aplica también a las variables definidas en clases
● Ejs:
class apache::mod::passenger {...}
define apache::vhost {...}
● En la versión 3 hay alguna incompatibilidad con versiones
anteriores. Ver
http://docs.puppetlabs.com/puppet/3/reference/lang_namespaces.html
13. Curso de Puppet – Lenguaje de configuración
13
Espacios de nombres:Espacios de nombres:
casoscasos
● Si el nombre no incluye :: (esto es, no hay espacio de
nombres) busca en
<modulepath>/nombre/manifests/init.pp
● Si el nombre incluye una o más veces :: de la forma
a::b::nombre (sí hay espacio de nombres) busca en
<modulepath>/a/manifests/b/nombre.pp
● Ejs:
class apache::mod::passenger {...}
buscaría en
<modulepath>/apache/manifests/mod/passenger.pp
14. Curso de Puppet – Lenguaje de configuración
14
ClasesClases
● Son bloques de código, agrupables en
módulos, para el tratamiento unificado de
recursos semejantes o relacionados
● Distinción:
● Definición: hace que esté disponible para un
uso posterior
● Declaración: añade los recursos una clase a
un catálogo
15. Curso de Puppet – Lenguaje de configuración
15
Clases: Definición (1)Clases: Definición (1)
● Sintaxis sin parámetros:
class nombreclase {
... #declaración de recursos,...
}
● Sintaxis con parámetros:
class nombreclase ($param1, $param2=valor,...,$paramN) {
... #declaración de recursos,...
}
Puede haber , antes del paréntesis de cierre
Los parámetros pueden llevar un valor por defecto (pero si falta y en
ejecución no hay valor, da error)
16. Curso de Puppet – Lenguaje de configuración
16
Clases: Definición (2)Clases: Definición (2)
● Reglas sobre el identificador:
● Comienza con minúscula y puede contener minúsculas,
números y _
● Puede hacer referencia a espacios de nombres con :: ej:
espacio1::espacio2:: ... ::clase1
● Lugar de definición:
● Preferentemente, en el directorio manifests/ de cada
módulo, con un fichero por cada clase
● Otras opciones: en site.pp o en manifests importados
● No recomendado: dentro de otra clase (anidamiento)
17. Curso de Puppet – Lenguaje de configuración
17
Clases: DeclaraciónClases: Declaración
● Formas de declaración:
● "Include-Like":
– Permite declarar una clase múltiples veces sin dar error
– No permite sobreescribir valores
● "Resource-Like":
– Una clase sólo se puede declarar una vez
– Permite sobreescribir valores
● Lugar de declaración:
● En definición de nodo
● En site.pp
● En otras clases o tipos definidos
18. Curso de Puppet – Lenguaje de configuración
18
Clases:Clases:
Declaraciones "Include-like"Declaraciones "Include-like"
● Principales:
● Función include: declara una o varias clases separadas por , o
en array, ej:
include base::linux, apache
● Función (no metaparámetro) require: declara una o más clases
estableciendo dependencias, pero cuidado con las relaciones
circulares
● Otras:
● contain: (v3.4): para incluir una clase en otra
● hiera_include: para el plugin de datos jerárquicos Hiera
19. Curso de Puppet – Lenguaje de configuración
19
Clases:Clases:
Declaraciones "Resource-like"Declaraciones "Resource-like"
● Se declaran con class, sin o con sobreescritura:
Ej:
class {'base::linux':}
class {'apache':
version => '2.2.21',
}
20. Curso de Puppet – Lenguaje de configuración
20
Clases: HerenciaClases: Herencia
● Se permite la herencia simple (de una sola clase), siempre
que la clase base no tenga parámetros.
● Sintaxis de definición con herencia:
class nombreclase inherits nombreclasebase {
... #declaración de recursos,...
}
● Se heredan variables y valores por defecto de recursos
● La clase derivada adquiere un nuevo ámbito: el de la
clase base
● La declaración (no definición) de una clase derivada hace
que automáticamente se declare antes la clase base
21. Curso de Puppet – Lenguaje de configuración
21
Clases: Herencia:Clases: Herencia:
SobreescrituraSobreescritura
● Se pueden sobrescribir (o eliminar con undef)
atributos de recursos usando referencias a los
recursos de la clase base
● Para añadir metaparámetros, la sintaxis en clases
derivadas es mediante el operador +>
ej:
class apache::ssl inherits apache {
Service['apache]{
require +> [ File['apache.pem'],
File['httpd.conf'] ],
}
}
22. Curso de Puppet – Lenguaje de configuración
22
RecursosRecursos
● Son el elemento básico para modelar configuraciones
● Hay unos 50 tipos predefinidos (paquete, servicio,
fichero,...) y además se pueden definir nuevos tipos
● Listados: puppet describe --list
http://docs.puppetlabs.com/references/stable/type.html
● Ayuda: puppet describe package | less
● Llevan un identificador ("title")
23. Curso de Puppet – Lenguaje de configuración
23
Recursos: AtributosRecursos: Atributos
● Cada recurso tiene unos atributos, según el tipo, que
describen su estado, ej. si ha de estar instalado un
paquete
● Cuando se aplica un catálogo, se compara el valor real de
cada atributo con el declarado, para hacer o no cambios.
Si se hacen, el orden es según dependencias y el más
eficiente
● Los cambios se auditan quedando registrados en el log
24. Curso de Puppet – Lenguaje de configuración
24
Recursos: Atributos especialesRecursos: Atributos especiales
● Name o Namevar:
● Nombre que identifica al recurso en el sistema destino (ej. el path de
un fichero)
● Es distinto del identificador para Puppet, pero a menudo coinciden. Ej:
identificador ntp y nombre ntpd en Red Hat, ntp en Debian,...
● ensure: hace referencia a aspectos dependientes del tipo y del sistema, ej.
asegurar que un servicio está en marcha. En general sus valores típicos son
present y absent
● provider: implementación del recurso en un sistema. Es sobreescribible,
ej. Instalación de librerías Ruby con apt-get o con gemas
● Metaparámetros
25. Curso de Puppet – Lenguaje de configuración
25
Recursos: MetaparámetrosRecursos: Metaparámetros
● Son atributos especiales que pueden usarse en
cualquier tipo de recurso (comunes al framework)
● No dan información sobre el estado sino cómo ha de
actuar Puppet con el recurso
● Referencia:
http://docs.puppetlabs.com/references/stable/metaparameter.html
● Ej:
puppet describe package -m | grep -A 20 "Meta Parameters"
26. Curso de Puppet – Lenguaje de configuración
26
Recursos: Metaparámetros (1)Recursos: Metaparámetros (1)
● alias: vale para establecer dependencias, ej:
file { '/etc/ssh/sshd_config':
...
alias => 'sshdcfg'
}
Uso:
subscribe => File['sshdcfg']
● audit: marca un atributo, un array de atributos o todos (all) para auditar
en el log y en informes de inspección
● loglevel: indica el nivel de log. Puede ser debug, info, notice,
warning, err, alert, emerg, crit, verbose
● noop: si está definido a true no se hace ninguna operación con el recurso
27. Curso de Puppet – Lenguaje de configuración
27
Recursos: Metaparámetros (2)Recursos: Metaparámetros (2)
● require: indica recursos requeridos o de los que depende el
objeto actual, de modo que los indicados se aplican antes del
actual
● before: referencia a otros objetos que dependen del actual,
el cual se aplica antes que los demás.
● notify: idem que before pero refrescando los objetos
dependientes cuando el objeto actual se modifica
● subscribe: opuesto a notify
28. Curso de Puppet – Lenguaje de configuración
28
Recursos: Metaparámetros (3)Recursos: Metaparámetros (3)
● schedule: indica la referencia a un objeto de tipo schedule, ej:
schedule { 'daily':
period => daily,
range => "2-4"
}
exec { "/usr/bin/apt-get update":
schedule => 'daily'
}
● stage: indica el entorno o etapa a la que corresponde una clase (no es aplicable en
recursos). Útil si se definen otras etapas aparte de la main, ej:
stage{['pre','post']}
● tag: añade etiquetas a un recurso, ej:
file {'/etc/hosts':
tag => ['importante', 'pendiente'],
Para ej. aplicar filtrando por tags:
puppet agent --test --tags pendiente
29. Curso de Puppet – Lenguaje de configuración
29
Recursos: DeclaraciónRecursos: Declaración
● Declaración de recurso: bloque de código que hace que se
incluya en un catálogo, para gestionar su estado en el
agente
● Son independientes de ámbito: pueden ser referenciados
desde donde sea
● Dónde se declaran y cuándo se compilan:
● Si están en una clase, cuando se declara
● Si están en un tipo de recurso definido, cuando se declara
su instancia
● Si son un recurso virtual, cuando se materializa
30. Curso de Puppet – Lenguaje de configuración
30
Recursos:Recursos:
Declaración: Sintaxis (1)Declaración: Sintaxis (1)
● Sintaxis para un recurso:
tipo_recurso { 'identificador':
atributo1 => valor1,
atributo2 => valor2,
...
}
● Sintaxis para varios recursos, mediante array:
tipo_recurso { ['id1','id2','id3',...]:
atributo1 => valor1,
atributo2 => valor2,
...
}
● Sintaxis para varios recursos, mediante zonas de recurso:
tipo_recurso {
'id1':
atributo1.1 => valor1.1,
...;
'id2':
atributo2.1 => valor2.1,
...;
}
31. Curso de Puppet – Lenguaje de configuración
31
Recursos:Recursos:
Declaración: Sintaxis (2)Declaración: Sintaxis (2)
● El identificador ha de ser único para cada tipo de recurso
● Atributos:
● Muchos tienen un valor por defecto
● Para los atributos que se declaren hay que asignarles
un valor
● Si son multivalor, éstos se asignan con un array
● Antes de } puede haber una ,
32. Curso de Puppet – Lenguaje de configuración
32
Recursos:Recursos:
Modificación de atributosModificación de atributos
● Mediante referencia: permite añadir atributos, o modificarlos en el
caso de clases heredadas, ej:
file {'/etc/passwd':
ensure => file,
}
File['/etc/passwd'] {
owner => 'root',
}
● Mediante recolector:
File <| tag == 'superuser' |> {
owner => 'root',
}
33. Curso de Puppet – Lenguaje de configuración
33
Recursos por defectoRecursos por defecto
● Especifican valores por defecto para determinados
atributos en un tipo concreto de recursos. Una
declaración de ese tipo usará los valores definidos
● En un ámbito dado se pueden sobreescribir los valores
por defecto de ámbitos superiores
● Sintaxis de definición:
Tipo_recurso {
atributo1 => valor1
...
}
Ej:
Contexto1::Contexto2::File {
group => 'all'
}
34. Curso de Puppet – Lenguaje de configuración
34
Referencias a recursosReferencias a recursos
● Identifican un recurso de configuración, según las sintaxis:
Tipo['id1']
Tipo['id2','id2',...,'idN']
Ejs:
File['/etc/sudoers']
Package['ldap-utils','slapd']
Espacio1::Package['sudo']
● La primera letra del nombre o nombres de espacio ha de ir en
mayúscula
● Es un tipo de datos. Internamente en Ruby el tipo es un
Puppet::Resource
35. Curso de Puppet – Lenguaje de configuración
35
Dependencias entre Recursos:Dependencias entre Recursos:
Metaparámetros de relaciones (1)Metaparámetros de relaciones (1)
● Válidos para relacionar recursos
● Aplicar un recurso después del aplicar el recurso destino: require
Ej: Procesar el fichero /etc/sudoers después de instalar el paquete
sudo:
file {'/etc/sudoers':
...
require => Package["sudo"],
}
● Idem que el anterior con notificación: subscribe
● Aplicar un recurso antes de aplicar el recurso destino: before
Ej: before => Exec["nagios-rebuid"]
● Idem que el anterior con notificación: notify
36. Curso de Puppet – Lenguaje de configuración
36
Dependencias entre Recursos:Dependencias entre Recursos:
Metaparámetros de relaciones (2)Metaparámetros de relaciones (2)
● Sintaxis:
tipo_recurso {'recurso':
...
metaparámetro => referencia_a_recurso_destino,
}
Ejemplo:
file {'/etc/sudoers':
...
require => Package["sudo"],
}
● Sintaxis en clases derivadas: operador +>
ej:
class apache::ssl inherits apache {
Service['apache]{
require +> [ File['apache.pem'],
File['httpd.conf'] ],
}
}
37. Curso de Puppet – Lenguaje de configuración
37
Dependencias entre Recursos:Dependencias entre Recursos:
Otros métodosOtros métodos
● Para relacionar recursos, uso de flechas:
● recurso1 => recurso2
Se aplica primero recurso1 y después recurso2
Ej: File['/etc/ntp.conf'] => Service['ntpd']
● recurso1 ~> recurso2
Se aplica primero recurso1 y después recurso2, y además se notifica a
recurso2 si recurso1 ha cambiado
● Para relacionar clases, función require:
● Ej:
class wordpress {
require apache
require mysql
...
}
38. Curso de Puppet – Lenguaje de configuración
38
Tipos de recursos definidosTipos de recursos definidos
● También llamados"Defined types" o "Defines"
● Bloque de código que actúa como un nuevo
tipo de recurso
● Al igual que en las clases, se distingue entre
definición y declaración. La declaración es la
instancia concreta, el recurso en sí
● Admiten metaparámetros y valores por
defecto
39. Curso de Puppet – Lenguaje de configuración
39
Tipos de recursos definidos:Tipos de recursos definidos:
DefiniciónDefinición
● Sintaxis sin parámetros:
define nombretipo {
... #declaración de recursos,...
}
● Sintaxis con parámetros:
define nombretipo ($param1, $param2=valor,...,$paramN) {
... #declaración de recursos,...
}
● Notas:
● Reglas para el nombre idem que para las clases
● Puede haber , antes del paréntesis de cierre
● Los parámetros pueden llevar un valor por defecto (si falta y en
ejecución no hay valor, da error)
40. Curso de Puppet – Lenguaje de configuración
40
Tipos de recursos definidos:Tipos de recursos definidos:
DeclaraciónDeclaración
● Idem que un recurso normal. Se definen dentro de cada módulo (un fichero por tipo
bajo el directorio manifests correspondiente) o bien en site.pp.
● Los parámetros que no tienen valores por defecto han de ser asignados con
notación de atributos (operador => y no =), ej:
tipo_recursoA {'identificadorA':
param1=>valor1,
...
}
tipo_recursoB {'identificadorB':}
● El identificador puede ser una combinación de atributos mientras sea único, ej:
file { "${vhost_dir}/${servername}.conf": ...
● Atributos extras, disponibles en la lista de parámetros de la definición
● $title: identificador de la instancia
● $name: por defecto el identificador, pero se puede especificar otro valor en la
declaración
41. Curso de Puppet – Lenguaje de configuración
41
Tipos de recursos CustomTipos de recursos Custom
● Semejantes a tipos definidos, pero con más
complejidad por incluir proveedores
● Relacionan:
● Tipo: parámetros, validación de entrada,
funcionalidades a proveer
● Proveedores: implementación de funcionalidades en
operaciones específicas de cada sistema
● Sintaxis: se usa newtype
● Se escriben en Ruby
42. Curso de Puppet – Lenguaje de configuración
42
Recursos virtualesRecursos virtuales
● Semejantes a recursos (identificador, tipo,...), establecen un
estado deseado para un recurso sin añadirlo al catálogo.
Posteriormente se puede añadir al catálogo incluyendo
("realize") el recurso virtual
● Se declaran una sola vez, y se pueden incluir múltiples veces
● Uso:
● Gestión de recursos dependiente de condiciones
● Uso de un recursos que se solapan en varias clases
● Semejantes a clases. Diferencia: Se pueden gestionar con
recolectores
43. Curso de Puppet – Lenguaje de configuración
43
Recursos virtuales:Recursos virtuales:
Sintaxis de declaración y usoSintaxis de declaración y uso
● Declaración:
@tipo {'identificador':
...
}
Ej:
@user { 'prueba':
uid => 1000,
tag => [desarrollo, pruebas],
}
● Inclusión mediante realize:
realize Tipo['identificador']
Ej:
realize User['desarrollo']
● Inclusión mediante un recolector:
Tipo <| condición |>
Ej:
User <|tag==desarrollo|>
44. Curso de Puppet – Lenguaje de configuración
44
Recolectores de recursosRecolectores de recursos
● Seleccionan recursos a partir de una búsqueda de atributos
definidos en manifests (no según el estado del recurso en el
destino).
● Utilidades:
● Listado de recursos
● Usar recursos virtuales
● Definir dependencias encadenadas
● Sintaxis: Tipo_recurso <| expresión_de_búsqueda |>
Ej:
User <| tag == 'local' |>
45. Curso de Puppet – Lenguaje de configuración
45
Recursos exportadosRecursos exportados
● Permiten compartir información entre nodos
● Especifica un estado deseado para un recurso,
no gestiona ese estado para el sistema
destino, y publica el recurso para ser usado en
otros nodos, los cuales pueden recoger el
recurso exportado y gestionar una copia local
● Requieren PuppetDB
46. Curso de Puppet – Lenguaje de configuración
46
EtiquetasEtiquetas
● Etiquetas o palabras clave a asignar a cada recurso
● Uso: obtener un conjunto de recursos con recolectores y en
expresiones de comparación:
● En aplicación de catálogos, ej:
sudo puppet agent --test --tags upgrade,holanda
● En informes, ej. de tipo "tagmail", para enviar mensajes cuando
recursos con determinadas etiquetas hayan variado
47. Curso de Puppet – Lenguaje de configuración
47
Etiquetas:Etiquetas:
AsignaciónAsignación
● Se asignan automáticamente etiquetas con:
● El tipo de recurso
● Para la clase o tipo definido correspondiente a la declaración del
recurso, el nombre completo y cada identificador del espacio de
nombres
Ej: si la clase es apache::ssl se crearían apache::ssl, apache,
ssl
● Para hacer una asignación manual:
● Uso del metaparámetro tag Ej: tag => ['etiq1','etiq2']
● Uso de la función tag en una definición de clase o de tipo de recurso,
para asignar la etiqueta a los recursos contenidos dentro. Ej:
class usuario {
tag 'importante', 'urgente'
recurso ...