Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

Hiera en puppet


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

Autor: Kr0m -- 14/05/2016 11:05:05