Rollen und Profile

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.

Struktur von Rollen und Profilen

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.

Struktur von Profilen und Ressourcen

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
}