Puppet Hiera

Vanaf Puppet versie 3 is er Hiera. Hiera is ervoor om de data te scheiden van de code. Buiten het feit dat dit de configuratie overzichterlijker maakt is het ook eenvoudiger om de code uit te besteden aan developers en de data door implementatie te laten configureren. Hoe dan ook, we gaan de Hiera-functies gebruiken in Puppet.

een voorbeeld:

Stel, je hebt een my_sql database en wilt middels puppet de toegang beheren. In een standaard manifest-file zou een my_sql: stanza er alsvolgt uit kunnen zien:

mysql::db { 'mydatabase':
    user     => 'dbuser',
    password => 'mysecret',
    grant    => ['all'],
}

Om nu de data te scheiden van de functie, kun je dit verbeteren naar:

mysql::db { $database:
    user     => $db_user,
    password => $db_password,
    grant    => ['all'],
}

Waardoor de data nu in een aparte class of in een node-definitie geplaatst wordt. Dit staat dan echter nog steeds ergens in de code en Hiera biedt een betere oplossing. De code ziet er dan alsvolgt uit:

mysql::db { $database:
    user     => hiera('database_user'),
    password => hiera('database_password'),
    grant    => ['all'],
}

Hiermee wordt het beheer van de data in hiera geplaatst, buiten de puppet code dus!

Hiera configuratie

Hiera wordt geconfigureerd middels een hiera.yaml bestand en voor elke environment staat er een versie op de puppetmaster. Bijvoorbeeld: /etc/puppetlabs/code/environment/musicplayer/hiera.yaml De inhoud is alsvolgt:

---
version: 5
hierarchy:
   - name: "Nodes"
     path: "nodes/%{::trusted.certname}.yaml"
   - name: "common"
     path: "common.yaml"
defaults:
   datadir: hieradata
   data_hash: yaml_data

(let op de drie streepjes aan het begin van een yaml-file. Deze zijn verplicht! Gebruik tenminste 3 spaties voor inspringen!)

Zoals je kunt zien is de standaard-datadirectory voor hiera voor onze musicplayer environment alsvolgt: /etc/puppetlabs/code/environments/musicplayer/hieradata

Hierin staat common.yaml en volgens de hierarchy ook in de nodes directory met hun certificaat-naam gevolgd door de extensie .yaml:

.
├── common.yaml
└── nodes
 ├── badkamer.digitalinfo.local.yaml
 ├── demoruimte.digitalinfo.local.yaml
 ├── huiskamer.digitalinfo.local.yaml
 ├── keuken.digitalinfo.local.yaml
 └── tuin.digitalinfo.local.yaml

In het bestand huiskamer.digitalinfo.local.yaml staat bijvoorbeeld het volgende:

---
mysql::db::database_user: dbuser
mysql::db::database_password: mypassword

en deze kunnen we opvragen met het volgende commando:

puppet lookup mysql::db::database_user --environment musicplayer --node huiskamer.digitalinfo.local
--- dbuser
...

Hiermee kan dus de mysql: stanza alsvolgt gebruikt worden om de user en password uit Hiera te halen:

mysql::db { $database: 
  user => hiera('database_user'), 
  password => hiera('mysql::db::database_password'), 
  grant => ['all'], 
}