Mit zunehmender Größe der Systemlandschaft wächst auch die Codebasis in Puppet. Sollen nun mehrere Systeme exakt gleich konfiguriert werden, führt dies schnell zu redunantem Code. Craig Dunn hat daher 2012 einige Best Practices zur Abstraktion in Rollen und Profile vorgestellt.
Ziel dieser Vorgehensweise ist es die Logik auf der Serverebene (Node) zu reduzieren und die Wiederverwendbarkeit zu steigern.
Eine Rolle beschreibt dabei die spätere Funktion / Rolle des Systems (z.B. WordPress Instanz). Hierfür sind bekanntermaßen ein Webserver, eine Datenbank und die WordPress Dateien selbst notwendig.
Diese Bestandteile werden von Profilen abgebildet.
Auf diese Weise kann z.B. ein Profil Webserver
erstellt werden, welches ebenfalls für andere Rollen (z.B. Eigene Applikationen, CMS, Shopsystem) verwendet werden kann. Ein Profil kann sowohl direkte Angaben von Ressourcen als auch andere eingebundene Klassen (z.B. von Puppet Forge) enthalten.
Somit besteht eine Rolle immer aus einem oder mehreren Profilen.
Beispiel
Um das Konzept dahinter besser zu verstehen zu können, schauen wir uns die nachfolgende Definition an.
class role {
}
class role::wordpress inherits role {
include profile::base
include profile::webserver
include profile::database
include profile::wordpress
}
Oder nachfolgend für eine andere z.B. eigene Applikation, die ohne Webserver auskommt.
class role {
}
class role::myapp inherits role {
include profile::base
include profile::database
include profile::myapp
}
Profile
In den Profilen werden die Module mit Parametern versorgt. Für das Profil Webserver ist es daher ratsam z.B. den Document Root per Parameter im Profil übergeben zu können. Nur auf diese Weise bleibt das Profil jederzeit leicht wiederverwendbar.
Rollenzuweisung
Im Regelfall besitzt ein Serversystem eine Rolle und erfüllt damit einen bestimmten Zweck. Natürlich existieren auch Systeme, die mehrere Funktionen gleichzeitig erfüllen. Auch das ist mit dem Rollen Ansatz möglich. Das folgende Beispiel beschreibt einen Server mit Grundkonfiguration, WordPress, PHPMyAdmin und Drupal.
node foo.bar {
include role::base
include role::wordpress
include role::phpmyadmin
include role::drupal
}
Praxis Beispiel
Nachfolgend nochmal ein direktes Beispiel aus der Praxis. Hierbei handelt es sich um mehrere WordPress Instanzen für Kundenwebseiten. Statt für jeden Server die einzelnen Module bzw. Klassen nochmals zu konfigurieren und mit immer gleichen Parametern zu versorgen, wird diesen einfach die entsprechende Rolle zugeordnet.
node wp01.enteksystems.local {
include role::base
include role::wordpress
}
node wp02.enteksystems.local {
include role::base
include role::wordpress
}