Server automatisiert bereitstellen mit Ansible
Neue Server wurden bei Bedarf von Hand aufgesetzt — Betriebssystem, Pakete, Konfiguration, Benutzer, Dienste, jedes Mal einzeln. Das funktioniert, solange es wenige sind. Aber es kostet jedes Mal dieselbe Zeit, und kein Server gleicht dem anderen exakt: hier eine andere Version, dort eine Einstellung, die jemand später von Hand nachgezogen hat. Bei jedem neuen System begann die gleiche Handarbeit von vorn, und wenn etwas klemmte, war schwer zu sagen, ob es am System lag oder an einer vergessenen manuellen Anpassung. Wer den Server ursprünglich eingerichtet hatte, war oft die einzige Person, die ihn wirklich kannte.
Die Bereitstellung neuer Server so aufsetzen, dass sie schnell geht, wiederholbar ist und jedes Mal dasselbe Ergebnis liefert — dokumentiert, nicht im Kopf einer einzelnen Person.
Ich habe die immer gleichen Schritte in Ansible abgebildet: Grundkonfiguration, Pakete, Dienste, Benutzer und Rechte. Aus einmaliger Handarbeit wurde versionierter Code, den ich wiederverwenden kann. Ein neuer Server entsteht seitdem nicht mehr durch Zusammenklicken, sondern durch einen Lauf, der auf jeder Maschine dasselbe tut — nachvollziehbar, weil jeder Schritt im Code steht.
Der erste Wurf war ein einziges, langes Playbook, das alles auf einmal erledigte. Es lief — war aber schwer zu lesen und noch schwerer wiederzuverwenden, sobald ein Server leicht anders sein sollte als der vorige. Ich habe es deshalb in kleinere, wiederverwendbare Rollen zerlegt und die maschinenspezifischen Werte in Variablen ausgelagert. Dieser Umbau hat kurzfristig Zeit gekostet, die ich lieber gespart hätte. Ohne ihn wäre aus der Automatisierung aber schnell wieder ein Flickwerk aus Sonderfällen geworden — genau das, was ich eigentlich abschaffen wollte.
Server werden seither reproduzierbar und in einem Bruchteil der früheren Zeit bereitgestellt. Was vorher wiederholte Handarbeit pro Maschine war, ist ein Lauf, der überall dasselbe Ergebnis liefert; die gesparte Zeit summiert sich mit jedem weiteren Server. Und weil die Konfiguration in Code liegt statt in Erinnerungen, ist nachvollziehbar, warum ein Server so aussieht, wie er aussieht — auch für jemanden, der ihn nicht selbst aufgesetzt hat.
Von Anfang an in kleinen Rollen denken statt in einem großen Playbook. Der Zwischenschritt über die monolithische Variante war vermeidbar — die Aufteilung, die am Ende stand, hätte gleich der Startpunkt sein können.