![Puppet: ¿Cómo utilizar un conjunto de paquetes comunes pero permitir excepciones?](https://rvso.com/image/658336/Puppet%3A%20%C2%BFC%C3%B3mo%20utilizar%20un%20conjunto%20de%20paquetes%20comunes%20pero%20permitir%20excepciones%3F.png)
Tengo alrededor de 200 máquinas virtuales Linux más o menos idénticas. Hay una clase para todas las configuraciones comunes:
class my_packages {
class { "::ntp":
servers => [ "de.pool.ntp.org" ],
}
....
}
que incluyo en cada nodo en site.pp.
Ahora quiero ejecutar mi propio servidor de hora local, lo cual es trivial usando el paquete puppetlabs/ntp. Simplemente tengo que reemplazar la entrada de servidores en my_packages con la dirección IP de la nueva VM del servidor de tiempo, y esa VM ahora tiene la misma entrada de clase ntp que se usó anteriormente en my_packages.
node 'mytime' {
# include my_packages
class { '::ntp':
servers => [
'de.pool.ntp.org',
'ptbtime1.ptb.de',
'ptbtime2.ptb.de',
'ptbtime3.ptb.de',
],
}
...
}
Sin embargo, dado que la entrada de clase "::ntp" ahora está definida en el nodo, no puedo incluir my_packages en la entrada del nodo para mi nueva máquina virtual de servidor de tiempo, porque en este caso aparece un error de "Declaración duplicada".
Se ha producido un problema similar al utilizar un servidor de nombres local. Cada VM tiene un archivo /etc/resolv.conf que apunta al servidor de nombres local, por lo que hay un recurso de archivo para eso en my_packages. Pero el servidor de nombres local debe tener un archivo /etc/resolv.conf diferente; no puede apuntar a sí mismo hasta que se complete la instalación, lo cual no ocurre durante la instalación.
¿Cuál es la mejor práctica para utilizar un conjunto común de recursos, pero permitiendo excepciones ocasionales?
Respuesta1
Si está utilizando Puppet 3 o posterior, la mejor manera de abordar esto sería usar hiera para realizarbúsqueda automática de parámetros. En resumen, le permite declarar clases usando la sintaxis de inclusión en lugar de la sintaxis de estilo de recurso, lo que significa que puede tener múltiples declaraciones para la clase. Tenga en cuenta que no puede mezclar declaraciones de estilo de inclusión y de recurso para una clase.
Normalmente, si utilizara la sintaxis de inclusión para declarar una clase, fallaría si tuviera algún parámetro requerido. Cuando utiliza la búsqueda automática de parámetros, Puppet intentará buscar los valores de los parámetros a través de hiera.
Hiera se llama así porque intentará buscar valores a través de una jerarquía de fuentes de datos. Puede especificar esta jerarquía en hiera.yaml y puede compararla con varios datos (nombre de host, datos personalizados, etc.) o verificar archivos codificados.
A continuación se muestra un breve ejemplo que podría funcionar en su caso:
Definición de clase:
class my_packages {
include ::ntp
...
}
mytime.yaml:
----
ntp::servers:
- 'de.pool.ntp.org'
- 'ptbtime1.ptb.de'
- 'ptbtime2.ptb.de'
- 'ptbtime3.ptb.de'
común.yaml:
---
ntp::servers: ['de.pool.ntp.org']
hiera.yaml:
...
:hierarchy:
- "${::fqdn}"
- common
...
En este caso, hiera intentaría buscar un valor para el parámetro de servidores en la clase ntp, usando la clave ntp::servers. Primero buscaría esa clave en cualquier archivo yaml que coincida con el nombre de host, y luego buscaría en common.yaml.
En la mayoría de los casos, usaría la clave en common.yaml, pero en el caso del nodo mytime encontraría un valor más alto en la jerarquía y dejaría de buscar allí.
Aquí hay un enlace a unejemplo completo, que por cierto cubre el módulo ntp.