Puppet: Hiera und Defined Types

puppetlabs apache vhost hiera howto

Das waren in etwa die Stichworte in der Suche als ich versucht habe meine mit dem puppetlabs/apache Modul definierten Apache vhosts aus der site.pp nach hiera zu migrieren. Es wollte nämlich einfach nicht klappen. Nach einiger Zeit bin ich dann darauf gestoßen, dass es sich bei dem apache::vhost um einen sogenannten Defined Type handelt. Diese sind sehr ähnlich zu Klassen, lassen sich aber im Gegensatz zu diesen mehrfach auf einem Node definieren.

Das automatische Parameter-Lookup wie bei den Klassen funktioniert bei Defined Types hingegen nicht. Lösung ist die create_resources() Funktion. Aber damit ich das später auch noch verstehe wenn ich hier in den Blogeintrag hineingucke schreibe ich ein praktisches Beispiel auf.

Ein Apache vhost in der site.pp:

node 'www.example.org' inherits default {
apache::vhost {'www.example.org':
  servername    => 'www.example.org',
  serveraliases => [ 'example.org' ],
  serveradmin   => 'webmaster@example.org',
  port          => '80',
  docroot       => '/var/www/example.org/www/',
}

wird in hiera zu:

---
apache::vhost:
  'www.example.org':
    servername: 'www.example.org'
    serveraliases:
      - 'example.org'
    serveradmin: 'webmaster@example.org'
    port: '80'
    docroot: '/var/www/example.org/www/'

und damit dieser Eintrag auch ausgewertet und der vhost erzeugt wird sieht die site.pp danach wie folgt aus:

node 'www.example.org' inherits default {
  $myApacheVhosts = hiera('apache::vhost', {})
  create_resources('apache::vhost', $myApacheVhosts)
}

Ich empfehle hier wärmstens das Chapter 3 – Using Hiera von Puppet Lunch. Ich habe lange im Netz gesucht und bin schließlich dort fündig geworden.

Puppet: Klassen in der Nodekonfiguration aus Hiera einbinden

Nachdem Hiera installiert ist moechte ich aufschreiben, wie man in der site.pp Klassen in der Nodekonfiguration aus Hiera einbindet. Dieser Blogeintrag baut inhaltlich auf der Struktur auf, die ich unter Puppet: Hiera und Puppet – Installation, Einrichten, Moduleinbindung beschrieben habe.

Im ersten Schritt werden die Klassen fuer den default Node extrahiert. Der Eintrag in meiner site.pp sieht vorher wie folgt aus:

node default {
  class { 'foo': }
  class { 'bar': }
  class { 'baz::moo': }
  include users::mmuster
}

Die Klassen werden dann in der folgenden Syntax in die common.yaml uebertragen:

---
classes:
  - foo
  - bar
  - baz:moo

Danach kann die Nodedefinition in der site.pp wie reduziert werden. Wichtig ist den abschliessenden whitespace nach dem Komma zu beruecksichtigen:

node default {
  hiera_include('classes','')
  include users::mmuster
}

Das ganze ist auch in der offiziellen Puppet Dokumentation beschrieben unter „Assigning Classes to Nodes With Hiera (hiera_include)„.