Hiera es una base de datos muy simple de tipo clave/valor, esta puede ser consultada desde nuestras clases de puppet de tal modo que la parte de código quede totalmente aislada de la de datos, esto nos permite escribir clases mas reutilizables y genéricas.
Configuramos la ruta del fichero de config de hiera
[main]
hiera_config = $confdir/hiera.yaml
Hiera permite almacenar la config en varios formatos, nosotros elegimos yaml. también indicamos la ruta de donde buscar la jerarquÃa y la estructura en la que buscar. Cuando algún host cumpla con la jerarquÃa tendrá a su disposición los parámetros clave/valor.
---
:backends:
- yaml
:yaml:
:datadir: /etc/puppet/hieradata
:hierarchy:
- "%{::environment}/location/%{::location}"
- "%{::environment}/common"
Creamos los directorios necesarios de la jerarquÃa.
mkdir -p /etc/puppet/hieradata/development/location/
Creamos un parámetro común a todos los hosts en entorno de producción a modo de ejemplo y algunos parámetros especÃficos de cada localización:
---
entorno: prod
vi /etc/puppet/hieradata/production/location/ISP1.yaml
---
zbx_server: 1.1.1.1
zbx_proxy: 1.1.1.2
bacula_server: 1.1.1.3
---
zbx_server: 2.2.2.1
zbx_proxy: 2.2.2.2
bacula_server: 2.2.2.3
chown -R puppet:pupet /etc/puppet/hieradata/
Reiniciamos servicios
/etc/init.d/apache2 restart
Comprobamos que PuppetMaster está leyendo la config correcta.
data_binding_terminus = hiera
hiera_config = /etc/puppet/hiera.yaml
Hiera por defecto busca en /etc/hiera.yaml, pero puppet en /etc/puppet/hiera.yaml, tenemos que hacer un pequeño hack para que todo funcione
ln -s /etc/puppet/hiera.yaml /etc/hiera.yaml
rm -rf /var/lib/hiera/
ln -s /etc/puppet/hieradata/ /var/lib/hiera
Preguntamos de forma manual en PuppetMaster por el parámetro entorno.
DEBUG: 2016-05-04 08:56:57 +0200: Hiera YAML backend starting
DEBUG: 2016-05-04 08:56:57 +0200: Looking up entorno in YAML backend
DEBUG: 2016-05-04 08:56:57 +0200: Looking for data source production/common
DEBUG: 2016-05-04 08:56:57 +0200: Found entorno in production/common
prod
Preguntamos por el parámetro zbx_proxy con localización ISP1 y entorno production
DEBUG: 2016-05-04 09:35:31 +0200: Hiera YAML backend starting
DEBUG: 2016-05-04 09:35:31 +0200: Looking up zbx_proxy in YAML backend
DEBUG: 2016-05-04 09:35:31 +0200: Looking for data source production/location/ISP1
DEBUG: 2016-05-04 09:35:31 +0200: Found zbx_proxy in production/location/ISP1
1.1.1.1
En principio se puede consultar la config desde los clientes con la cli de puppet pero en mi caso no conseguà que funcionase hasta hacerlo aplicando una clase que hiciese uso de hiera y mostrase los datos al aplicar la clase, mediante puppet apply no funcionó jamas, mas adelante se puede encontrar dicho ejemplo.
Pedimos manualmente desde el cliente los datos
Error: Could not find data item entorno in any Hiera data file and no default supplied at line 1 on node host00.alfaexploit.com
Error: Could not find data item entorno in any Hiera data file and no default supplied at line 1 on node host00.alfaexploit.com
Creamos la clase de test en PuppetMaster.
vi /etc/puppet/modules/hieratest/manifests/init.pp
class hieratest {
$entorno = hiera(entorno)
$zbx_proxy = hiera(zbx_proxy)
$bacula_server = hiera(bacula_server)
notify {"Entorno: $entorno":}
notify {"ZbxProxy: $zbx_proxy":}
notify {"BaculaServer: $bacula_server":}
}
Desde foreman importamos y aplicamos la clase.
En el cliente ejecutamos puppet.
Notice: Entorno: prod
Notice: Zbx_proxy: A.B.C.D
Notice: BaculaDir: bacula00
Hay algunas recomendaciones a tener en cuenta:
- No pasarse con el nivel de profundidad de la jerarquÃa de hiera o el rendimiento se irá a pique, max: 5
- Es posible utilizar hiera desde templates pero es mejor hacerlo en el manifest de la clase, asignar el valor a una variable local y hacer referencia a esta desde el template.
Si algo no funcionase siempre se puede intentar debugear con strace.