20. Februar 2012

Konfigurationsmanagement bei Otto: Wie wir mit puppet den Überblick behalten

by Marco

Auch ich gehöre zu den “neuen” in diesem Blog. Mein Name ist Marco, ich arbeitete seit ca. 1,5 Jahren bei Otto in der Abteilung Operations im Bereich eCommerce. Im Team verwalten wir Test- und Entwicklungssysteme um otto.de weiter entwickeln zu können. Dazu kommen diverse Werkzeuge die wir im Rahmen unserer Projekte benötigen.

Insgesamt sind es mittlerweile ca. 70 Linux Serversysteme die stets funktionieren müssen. Mit modernen Werkzeugen wie Virtualisierung sind wir in der Lage flexibel neue Server hinzuzufügen.

Die Linux Serversysteme werden für verschiedenste Zwecke eingesetzt und die Benutzer haben unterschiedlichste Rechte in die Systemkonfiguration einzugreifen. Manuell sicherzustellen, dass über 70 Server kontinuierlich den jeweils „richtigen“ Konfigurationsstand haben wäre nicht nur eine sehr ermüdende und aufwendige Aufgabe sie würde auch massiven Ressourcen Einsatz erfordern.

An dieser Stelle kommt ein Konfigurationsmanagement Tool zum Einsatz.
Im eCommerce Bereich von Otto benutzen wir dafür puppet (puppet labs).

Das Grundprinzip von puppet ist dabei simpel aufgebaut, der Puppetmaster liest regelmäßig die Konfiguration aus einem Versionskontrollsystem. Die Puppetclients fragen in einem definierten Abstand den Master, welche Konfigurationen für sie vorliegt. Irgendwie hat mich das ganze am Anfang an Token Ring erinnert, nur das wir keine Loks einsetzen ;) .

Wie sieht das in der Praxis aus? Wir verwalten z. B. SSH Keys mit Puppet. Dazu wird die authorized_keys Datei zentral in puppet gepflegt. Wenn wir jemanden SSH Zugriff auf die Shell eines Servers gewähren wollen, tragen wir den Key in die Datei ein und commiten dies in unser Versionskontrollsystem. Nach spätestens 30 Minuten hat puppet automatisch dafür gesorgt, dass der neue Key auf dem Zielsystem zur Verfügung steht und der Mitarbeiter den angeforderten Shell Zugriff erhält.

Zusätzlich behalten wir die Übersicht über die Zugriffsmöglichkeiten. Verändert jemand manuell die authorized_keys Datei eines Systems erkennt puppet dies und stellt den in puppet gespeicherten Zustand wieder her. Damit puppet alles findet müssen die Dateien in einem bestimmten Format abgelegt werden:


listing Dateistruktur Puppet Module:

modules
 otto_authorized_keys
  files
   otto_server01_authorized_keys
  manifests
   init.pp

Puppet verwendet Ruby als Programmiersprache um Module zu beschreiben. Mit einer eigenen Domain Specific Language kann man unter Berücksichtigung der Ruby und puppet Syntax Module schreiben.

Der Code um die authorized_keys Datei zu verwalten ist dabei relativ einfach. Wir brauchen zunächst eine Klasse, die den Namen des Puppet Moduls erhält. In dieser Klasse brauchen wir einen Ressource, die die Aufgabe bestimmt. In unseren Beispiel verwenden wir eine file Ressource. In den Ressourcen muss eine bestimmte Syntax eingehalten werden, damit Puppet die Aufgabe versteht und korrekt verarbeitet. Eine Klasse kann durchaus aus mehreren Ressourcen bestehen, im Beispiel haben wir uns auf eine beschränkt.


listing init.pp:

class otto_authorized_keys {
  file { "/home/otto/.ssh/authorized_keys":
    ensure => present,
    replace => true,
    mode => 600,
    owner => "otto",
    group => "ottogrp",
    path => "/home/otto/.ssh/authorized_keys",
    source => ["puppet://$server/otto/${hostname}_authorized_keys"],
  }
}

Diese Ressource kopiert die jeweils gültige authorized_keys Datei in das Verzeichnis /home/otto/.ssh und setzt die Dateirechte. Puppet erkennt dabei automatisch, wann sich eine Datei verändert hat. Zwecks Traffic- und Lastminimierung überprüft puppet dabei, ob die Datei überhaupt kopiert werden muss.

Mit der Variable $hostname sorgen wir dafür, dass das Puppet Modul generisch arbeitet und auf unterschiedliche Server angewendet werden kann.

Damit ein System weiss, ob ein Puppet Modul angewendet werden soll wird eine Datei (nodes.pp) gepflegt:


listing nodes.pp:

node 'otto_server01' {
  include otto_authorized_keys
}

In der Praxis hat sich gezeigt, dass durch den Einsatz von puppet wiederkehrende Aufgaben einfach automatisiert werden können. Ausserdem erhalten wir mehr Sicherheit über die Systemzustände – wo früher eine manuelle Pflege von Listen notwendig war reicht heute ein Blick in die puppet Konfiguration aus. Es werden weniger Fehler gemacht und gleichartige Änderungen können mit einem große Zeitvorteil auf mehreren Systemen ausgerollt werden. Ausserdem macht es viel mehr Spass, puppet Module zu pflegen als manuell immer das gleiche zu machen.

I <3 puppet ;)

Share |

Kommentieren