Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Curso puppet lenguaje_2

  • Login to see the comments

Curso puppet lenguaje_2

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 ...

×