Esta pagina se ve mejor con JavaScript habilitado

Hiera en puppet

 ·  🎃 kr0m

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

vi /etc/puppet/puppet.conf

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

vi /etc/puppet/hiera.yaml
---
: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/production/location/
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:

vi /etc/puppet/hieradata/production/common.yaml

---
entorno: prod
chmod 755 /etc/puppet/hieradata/production/common.yaml
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
vi /etc/puppet/hieradata/production/location/ISP2.yaml
---
zbx_server: 2.2.2.1
zbx_proxy: 2.2.2.2
bacula_server: 2.2.2.3
chmod 755 /etc/puppet/hieradata/production/location/*
chown -R puppet:pupet /etc/puppet/hieradata/

Reiniciamos servicios

/etc/init.d/foreman restart
/etc/init.d/apache2 restart

Comprobamos que PuppetMaster está leyendo la config correcta.

puppet master --configprint all|grep hiera

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

rm /etc/hiera.yaml
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.

hiera -d entorno ::environment=production

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

hiera -d zbx_proxy ::location=ISP1 ::environment=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

puppet apply -e “notice(hiera(’entorno’))”

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.

mkdir -p /etc/puppet/modules/hieratest/manifests
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":}
}
chown -R puppet:puppet /etc/puppet/modules/hieratest/

Desde foreman importamos y aplicamos la clase.

En el cliente ejecutamos puppet.

puppet agent -t

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.

strace hiera -c /etc/puppet/hieradata/production/common.yaml -d entorno ::environment=production 1&> salida

Si te ha gustado el artículo puedes invitarme a un RedBull aquí