Puppet in combinatie met Hiera


Waarom?

Hiera is een tool die je kunt gebruiken als een configuratie-backend voor je Puppet-setup. Het voordeel hiervan is dat je je puppetconfiguratie-code veel duidelijker en overzichtelijker kunt organiseren dan met Puppet alleen. Traditioneel gebuik je het manifests/site.pp bestand om te definieren welke nodes welke modules moeten krijgen, maar dat zorgt er vaak voor dat je manifests/site.pp file lang en onoverzichtelijk kan worden met veel repetitie. Daarnaast is het in hiera makkelijker om een hierarchie aan te brengen, daarmee bedoel ik dat je algemene code kunt schrijven voor het merendeel van je nodes, met values die geldig zijn voor een specifieke subset van je nodes. Het eindresultaat is in ieder geval een schonere configuratie van je gehele puppetomgeving zonder onnodige repetitie van stukken configuratiecode. Dat is vooral voor grotere puppetdeployments waar meerdere mensen aan werken van belang. Het bestand manifests/site.pp kan normaliter als snel een ingewikkelde spaghettibrij worden van code waar jij, je collega’s of de collega’s die na jou komen al snel door de bomen het bos niet meer kunne zien.

Wat is hiera?

Hiera is een (ruby-)programma dat zijn configuratie haalt uit configuratie file hiera.yaml. Dit bestand wordt gebruikt om de hiërarchie te definieren (yaml is een configuratie mark-up language waar je op een hele prettige manier ook hierarchische data kunt uitdrukken) en de backends kunt definieren. Het bestand hiera.yaml staat default in /etc/hiera.yaml (unix/linux omgevingen).

De configuratie file hiera.yaml wordt geschreven in YAML syntax. Voor de overige hiera configuratie (backends genoemd) kun je kiezen uit YAML of JSON (of eigen fabrikaat). Ik heb zelf een voorkeur voor YAML in plaats van JSON, maar dat is in principe arbitrair. Je mag ze ook door elkaar gebruiken in een enkele omgeving.

Installatie

Ik ga voor de voorbeeld installatie voor dit artikel uit van een CentOS/RedHat 6 omgeving met Puppet versie 3.X. Voor versie Puppet 2.7 en lager geldt een iets andere installatie procedure (zie http://docs.puppetlabs.com/hiera/1/installing.html).

Op de puppetmaster node installeer puppet zoals je normaliter zou doen. Daarna installeer je hiera RPM (uit EPEL repository):

# yum install hiera

De hiera RPM bestaat uit command-line /usr/bin/hiera, een aantal Ruby libraries en modules en een default /etc/hiera.yaml. Omdat puppet kijkt voor de hiera config file in /etc/puppet/hiera.yaml kijkt, maar de command-line hiera naar /etc/hiera.yaml kijkt, is het over het algemeen een goed idee om post-installatie van de hiera RPM het bestand /etc/hiera.yaml te verplaatsen naar /etc/puppet/hiera.yaml en een symlink te maken van /etc/hiera.yaml naar /etc/puppet/hiera.yaml.

De default standaard hiera.yaml ziet er (bijvoorbeeld) zo uit:

--- 
:backends: 
  - yaml
:yaml: 
  :datadir: /etc/puppet/hieradata
:hierarchy: 
  - "%{::clientcert}" 
  - "%{::custom_location}" 
  - common

In Puppet versie 3 en hoger zal puppet automatisch de aanwezigheid van /etc/puppet/hiera.yaml opmerken en vervolgens gaan parsen. Je hoeft hiervoor niet nog aanpassingen te doen aan puppet.conf file.

Een voorbeeld opzet van puppet met 1 ntp module en hiera

Als startpunt voor een puppet/hiera setup waar je verder zelf verder aan kunt uitbreiden volgt hieronder een voorbeeld opzet van puppet met hiera met een yaml backend en 1 puppet module (ntp) die gemeenschappelijk is voor alle nodes in je omgeving:

/etc/puppet/manifests/site.pp:

# Define the default node behavior.
node default {
class { "ntp": }
}

/etc/puppet/hiera.yaml:

---
:backends:
  - yaml
  - json
:yaml:
  :datadir: /etc/puppet/hiera
:json:
  :datadir: /etc/puppet/hiera
:hierarchy:
  - "%{::clientcert}"
  - "%{::environment}"
  - "virtual_%{::is_virtual}"
  - "node/%{::fqdn}"
  - common

/etc/puppet/hiera/node/puppet_client1.localdomain.yaml:

# vooralsnog leeg. Hier kun je later specifieke zaken 
# inzetten die alleen voor puppet_client1 relevant zijn.

/etc/puppet/hiera/webserver.yaml:

# vooralsnog leeg. Hier kun je later specifieke zaken 
# inzetten die alleen voor nodes in een webserver rol relevant zijn.

/etc/puppet/hiera/common.yaml:

---
  classes: "ntp"
  ntp::restrict: []
  ntp::autoupdate: true
  ntp::enable: true
  ntp::servers:
    - "0.us.pool.ntp.org iburst"
    - "1.us.pool.ntp.org iburst"
    - "2.us.pool.ntp.org iburst"
    - "puppet_master.localdomain iburst"

Dit roept dus in de eerste regel de puppet ntp module aan inclusief parameters.

Puppet ntp module (*) in /etc/puppet/modules/ntp/:

#ls /etc/puppet/modules/ntp/
CHANGELOG.md     Gemfile  manifests/   Rakefile         spec/       tests/
CONTRIBUTING.md  LICENSE  Modulefile  README.markdown  templates/

(*) de bovenstaande puppet ntp module is afkomstig van https://github.com/puppetlabs/puppetlabs-ntp en dat is een puppet module die parameters accepteerd.

De voorbeeld code hierboven zou foutloos moeten werken en kan gebruikt worden als startpunt voor verdere uitbreidingen voor jouw specifieke puppet omgeving(en).
Let op

  • Vergeet niet om iedere keer als je hiera.yaml configuratie file aanpast, om de puppetmaster daemon te herstarten.
  • Je kunt de hiera commandline gebruiken met -d vlaggetje om je hiera configuratie te testen of the troubleshooten. Voorbeeld correcte output:
    # hiera -d ntp::servers ::fqdn=puppet_client2.localdomain
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Hiera YAML backend starting
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Looking up ntp::servers in YAML backend
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Looking for data source virtual_
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Cannot find datafile /etc/puppet/hiera/virtual_.yaml, skipping
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Looking for data source node/puppet_client2.localdomain
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Looking for data source common
    DEBUG: Wed Jan 29 13:42:33 +0100 2014: Found ntp::servers in common
    ["0.us.pool.ntp.org iburst",
     "1.us.pool.ntp.org iburst",
     "2.us.pool.ntp.org iburst",
     "puppet_master.localdomain iburst"]
  • Lege of niet-bestaande backend yaml of json bestanden worden zonder foutmelding gewoon overgeslagen (je ziet dat wel voorbijkomen in debug mode). Zie in voorbeeld debug output hierboven:
    DEBUG: Cannot find datafile /etc/puppet/hiera/virtual_.yaml, skipping

Succes!
Zie verder: http://docs.puppetlabs.com/hiera/1/
Tags: UNIX/Linux Configuratiemanagement, Puppet, Hiera

Joost Soeterbroek <joost.soeterbroek@proxy.nl> is een UNIX/Linux System Engineer werkzaam voor Proxy BV in Rotterdam (www.proxy.nl).

 

Leave a comment

Your email address will not be published. Required fields are marked *