Hiera in gebruik

Written by Ger Apeldoorn on. Posted in Sysadmin

Voor dit artikel ga ik ervan uit dat je Hiera al hebt ingericht. Mocht dit nog niet zo zijn, lees dan eerst onderstaande artikelen voor meer achtergrondinformatie.

Een simpele waarde ophalen

Een waarde ophalen uit Hiera is bijzonder eenvoudig! Puppet kent de functie hiera(), deze doet al het werk voor je.

Laten we met een voorbeeldje werken, aanschouw dit YAML-bestand:

---
smarthost: mailserver.puppetspecialist.nl

Het Yaml-bestand begint altijd met 3 streepjes, daaronder staan de variabelen. Het is goed om ze netjes uit te lijnen, maar gebruik vooral GEEN tabs! (Dan werkt het niet meer)

Je kunt deze waarde eerst in een variabele stoppen of direct in een functie gebruiken:

class postfix {
  $smarthost = hiera('smarthost')

  #Of direct gebruiken:
  postfix::server { 'test':
     smarthost => hiera('smarthost'),
  }
}

Arrays ophalen

Je kunt ook Arrays definieren in Yaml, dit doe je door een lijstje op te geven. Ieder element wordt voorafgegaan met een streepje:

---
users: - harry
       - jan
       - ger
       - piet

Simpel toch?

Default waardes

Als je een Hiera-call doet en de waarde wordt niet gedefinieerd, dan geeft Puppet een foutmelding en stopt de Puppet-run. Je kunt ook een default-waarde opgeven:

  $smarthost = hiera('smarthost', 'default.server.nl')

Zo krijg je geen foutmelding wanneer de waarde niet wordt gevonden.

Resources direct uit Hiera

Een van de mooiste toepassingen van Hiera is wanneer je hem combineert met de create_resources() functie.

Wanneer je alle benodigde parameters in Hiera zet, kun je automatisch de resources aanmaken. Zo kun je in je nodedefinities een stuk makkelijker groeperen:

node /revproxy\d\d\.puppetspecialist\.nl/  {
  include role_lamp
  create_resources(apache::virtualhost, hiera('apache_virtualhost', []))
}
  • Let op de reguliere expressie; alle servers waarvan de naam bestaat uit ‘revproxy’, 2 getallen en dan ‘.puppetspecialist.nl’ vallen onder deze definitie.
  • De eerste parameter van ‘create_resources’ is het type resource.
  • De tweede parameter van ‘create_resources’ is een array, welke in dit geval wordt gevuld door Hiera. Merk op dat ik een lege array als default waarde opgeef, dit voorkomt een foutmelding wanneer er niets is gedefinieerd. Er worden in dat geval gewoon geen virtualhosts aangemaakt.

Hieronder vind je het bijbehorende yaml-bestand:

---
apache_virtualhost:
  vhost1.puppetspecialist.nl:         
    ssl:          yes 
    targetsite:   http://vhost1.intern.local/ 
    aliases:      mijnvhost.puppetspecialist.nl

  vhost2.puppetspecialist.nl:         
    ssl:          yes 
    targetsite:   http://vhost2.intern.local/ 
    aliases:      mijnvhost2.puppetspecialist.nl

  vhost3.puppetspecialist.nl:         
    ssl:          no
    aliases:      mijnvhost.puppetspecialist.nl

Let op de inspringing:

  • apache_virtualhost staat tegen de kantlijn
  • de naam van iedere virtualhost staat 2 spaties ingesprongen
  • de parameters voor de virtualhost staan 4 spaties ingesprongen
  • NOGMAALS: Geen tabs gebruiken, alleen spaties!

Dit is dus een prachtige manier om je node-definities een stuk overzichtelijker te maken!

De Hiërarchie van Hiera

Een van de redenen dat Hiera zo goed combineert met Puppet is de hiërarchische structuur. Zelfs als je een super-gestandaardiseerde omgeving hebt dan zijn er toch een paar irritante applicaties die moeten afwijken.

Gedurende het configureren van Hiera hebben we zelf al de gewenste hierarchie aangegeven:

---
:hierarchy:
    - hosts/%{fqdn}  # Hoogste prioriteit
    - %{domain}
    - common         # Laagste prioriteit
:backends:
    - yaml
:yaml:
    :datadir: '/etc/puppetlabs/puppet/environments/%{environment}_data'

Voorbeeld overriden waarden

Met Hiera kun je een basisinstelling neerzetten zonder dat de uitzonderingen je leven zuur maken. Een voorbeeld:

---
smarthost: mailserver.puppetspecialist.nl

Bovenstaande YAML-file (common.yaml) geldt voor alle systemen. In je module kun je als volgt de waarde voor de smarthost uitlezen:

class postfix {

  $smarthost = hiera('smarthost')

  #Doe iets met deze waarde
  .....
}

Echter… Onze uitgaande mailserver (mailserver.puppetspecialist.nl) moet natuurlijk de mail niet naar zichzelf doorsturen, maar b.v. naar de smarthost van de provider. Daarom overriden we deze waarde in het yaml-bestand die specifiek bij deze host hoort:

---
smarthost: mailserver.xs4all.nl

Arrays combineren

Zoals je net hebt kunnen lezen is het vrij eenvoudig om de ene waarde met andere te overriden. Maar wat als je een array hebt die je wilt combineren?

Stel je voor; je wilt op elke host een root gebruiker managen, eventueel aangevuld met extra users die host-specifiek zijn.

Zie common.yaml:

---
users: - root
       - sysadmin

en de host-specifieke devops01.gerapeldoorn.nl.yaml:

---
users: - harry
       - jan
       - ger
       - piet

Als we voor het aanmaken van de users create_resources(user, hiera(‘users’)) zouden gebruiken op de devops01.gerapeldoorn.nl.yaml, dan wordt de users-array ge-override. De users root en sysadmin zitten er dan niet in.

Het is wel mogelijk om alle elementen vanuit de hele hierarchie te gebruiken, hiervoor kun je de functie hiera_array(‘users’) gebruiken. Voor een Hash gebruik je hiera_hash(‘users’).

node /devops\d\d.puppetspecialist\.nl/  {
  create_resources(user, hiera_array('users'))
}

Meer informatie

Labels:, , , ,