Handbuch Infrastructure as Code: Prinzipien, Praktiken und Patterns für eine cloudbasierte IT-Infrastruktur
Von Kief Morris
()
Über dieses E-Book
- Mithilfe von Patterns und Antipatterns Automatisierung verstehen und erfolgreich umsetzen
- Pseudocode-Beispiele veranschaulichen die konkrete Umsetzung
- Diese Auflage beschreibt neben dem Managen von Servern jetzt auch komplexe Container-Plattformen
Kief Morris von ThoughtWorks zeigt in diesem Praxisbuch, wie Sie die von DevOps-Teams entwickelte Prinzipien, Praktiken und Patterns effektiv verwenden, um in der Cloud sicher und flexibel Infrastruktur zu managen. Es vermittelt, wie nicht nur Server, sondern auch komplexe Container-Plattformen (Stacks) aufgesetzt werden. Sie erfahren, wie sie mithilfe von Cloud- und Automatisierungstechnologien Änderungen einfach, sicher und schnell vornehmen. Sie lernen, wie Sie nahezu alles als Code definieren und setzen Praktiken aus dem Softwaredesign ein, um ein System aus kleinen, lose gekoppelten Elementen aufzubauen.
Zielgruppen sind Mitarbeiterinnen und Mitarbeiter in der Systemadministration, Infrastruktur-Entwicklung, Softwareentwicklung und Architektur.
Ähnlich wie Handbuch Infrastructure as Code
Ähnliche E-Books
Architekturpatterns mit Python: Test-Driven Development, Domain-Driven Design und Event-Driven Microservices praktisch umgesetzt Bewertung: 0 von 5 Sternen0 BewertungenEthereum – Grundlagen und Programmierung: Smart Contracts und DApps entwickeln Bewertung: 0 von 5 Sternen0 BewertungenVerteilte Systeme mit Kubernetes entwerfen: Patterns und Prinzipien für skalierbare und zuverlässige Services Bewertung: 0 von 5 Sternen0 BewertungenData Science mit AWS: End-to-End-Pipelines für Continuous Machine Learning implementieren Bewertung: 0 von 5 Sternen0 BewertungenNetzwerkinfrastruktur mit Windows Server 2016 implementieren: Original Microsoft Prüfungstraining 70-741 Bewertung: 0 von 5 Sternen0 BewertungenAngular: Das Praxisbuch zu Grundlagen und Best Practices Bewertung: 0 von 5 Sternen0 BewertungenPraxiswissen TYPO3 CMS 9 LTS Bewertung: 0 von 5 Sternen0 BewertungenPowerShell 7 und Windows PowerShell: Das komplette Praxiswissen für Administratoren und IT-Profis. Für Windows, Linux, macOS & Cloud Bewertung: 0 von 5 Sternen0 BewertungenPraxiswissen TYPO3 CMS 10 LTS: Der praxisnahe TYPO3-Einstieg, Komplette Beispielanwendung zum Download, Mit Tipps aus dem Support Bewertung: 0 von 5 Sternen0 BewertungenSpring Boot: Cloud-native Anwendungen mit Java und Kotlin erstellen Bewertung: 0 von 5 Sternen0 BewertungenAgile Softwareentwicklung mit C# (Microsoft Press): Best Practices und Patterns für flexiblen und adaptiven C#-Code Bewertung: 0 von 5 Sternen0 BewertungenPraxishandbuch Terraform: Infrastructure as Code für DevOps, Administration und Entwicklung Bewertung: 0 von 5 Sternen0 BewertungenKubernetes Patterns: Wiederverwendbare Muster zum Erstellen von Cloud-nativen Anwendungen Bewertung: 0 von 5 Sternen0 BewertungenNebenläufige Programmierung mit Java: Konzepte und Programmiermodelle für Multicore-Systeme Bewertung: 0 von 5 Sternen0 BewertungenPowerShell 5: Windows-Automation für Einsteiger und Profis Bewertung: 0 von 5 Sternen0 BewertungenPrinzipien des Softwaredesigns: Entwurfsstrategien für komplexe Systeme Bewertung: 0 von 5 Sternen0 BewertungenContinuous Delivery: Der pragmatische Einstieg Bewertung: 0 von 5 Sternen0 BewertungenIstio: Service Mesh für Microservices Bewertung: 0 von 5 Sternen0 BewertungenMicrosoft Exchange Server 2019 – Das Handbuch: Von der Einrichtung bis zum reibungslosen Betrieb Bewertung: 0 von 5 Sternen0 BewertungenGraphQL: Eine Einführung in APIs mit GraphQL Bewertung: 0 von 5 Sternen0 BewertungenVue.js kurz & gut Bewertung: 0 von 5 Sternen0 BewertungenApache OFBiz: Schnellstarterbuch Bewertung: 0 von 5 Sternen0 BewertungenMicrosoft Windows Server 2019 – Das Handbuch: Von der Planung und Migration bis zur Konfiguration und Verwaltung Bewertung: 0 von 5 Sternen0 BewertungenMicrosoft Windows Server 2016 – Das Handbuch: Von der Planung und Migration bis zur Konfiguration und Verwaltung Bewertung: 0 von 5 Sternen0 BewertungenDer Weg zum Python-Profi: Ein Best-Practice-Buch für sauberes Programmieren Bewertung: 0 von 5 Sternen0 BewertungenData Mesh: Eine dezentrale Datenarchitektur entwerfen Bewertung: 0 von 5 Sternen0 BewertungenWindows Internals: Band 1: Systemarchitektur, Prozesse, Threads, Speicherverwaltung, Sicherheit und mehr Bewertung: 0 von 5 Sternen0 BewertungenDatenbankentwicklung lernen mit SQL Server 2022: Der praxisorientierte Grundkurs – auch für SQL Server Express Bewertung: 0 von 5 Sternen0 BewertungenSoftwarequalität in PHP-Prozessen: Installation und Betrieb eines Jenkins-Servers Bewertung: 0 von 5 Sternen0 BewertungenPowerShell – kurz & gut: Für PowerShell 7 und Windows PowerShell 5 Bewertung: 0 von 5 Sternen0 Bewertungen
Computer für Sie
So findest du den Einstieg in WordPress: Die technischen Grundlagen zu Installation, Konfiguration, Optimierung, Sicherheit, SEO Bewertung: 0 von 5 Sternen0 BewertungenLaws of UX: 10 praktische Grundprinzipien für intuitives, menschenzentriertes UX-Design Bewertung: 0 von 5 Sternen0 BewertungenErste Schritte mit dem Raspberry Pi: Installation, Konfiguration, Tuning und Praxis für alle aktuellen Raspberry-Pi-Modelle Bewertung: 0 von 5 Sternen0 BewertungenTastenkombinationen für den Mac: Alle wichtigen Funktionen Bewertung: 0 von 5 Sternen0 Bewertungen60+ Webtools - Für den Unterricht und mehr: Unterricht Digital gestalten und spielerisch Online Unterrichten Bewertung: 0 von 5 Sternen0 BewertungenErfolgreich mit dem agilen Spotify Framework: Squads, Tribes und Chapters - der nächste Schritt nach Scrum und Kanban? Bewertung: 0 von 5 Sternen0 BewertungenDie KI Bibel, mit künstlicher Intelligenz Geld verdienen: Echte Fallbeispiele und Anleitungen zum Umsetzen Bewertung: 1 von 5 Sternen1/5Games | Game Design | Game Studies: Eine Einführung (Deutschsprachige Ausgabe) Bewertung: 0 von 5 Sternen0 BewertungenDas Excel SOS-Handbuch: Wie sie Excel (2010-2019 & 365) schnell & einfach meistern. Die All-in-One Anleitung für ihren privaten & beruflichen Excel-Erfolg! Bewertung: 0 von 5 Sternen0 BewertungenGrundlagen und Methoden der Wirtschaftsinformatik: Eine anwendungsorientierte Einführung Bewertung: 0 von 5 Sternen0 BewertungenDie Geschichte des Computers: Wie es bis zur Form des heutigen 'PC' kam. Bewertung: 0 von 5 Sternen0 BewertungenEinführung ins Darknet: Darknet ABC Bewertung: 0 von 5 Sternen0 BewertungenNeuronale Netze selbst programmieren: Ein verständlicher Einstieg mit Python Bewertung: 0 von 5 Sternen0 BewertungenDie KI sei mit euch: Macht, Illusion und Kontrolle algorithmischer Vorhersage Bewertung: 0 von 5 Sternen0 BewertungenNimm den Chor doch selber auf: Crashkurs für das Aufnehmen und Mischen von Chören Bewertung: 0 von 5 Sternen0 BewertungenScribus Desktop Publishing: Das Einsteigerseminar Bewertung: 0 von 5 Sternen0 BewertungenWordPress - Elementor Bewertung: 0 von 5 Sternen0 BewertungenAufstieg der Roboter: Wie unsere Arbeitswelt gerade auf den Kopf gestellt wird - und wie wir darauf reagieren müssen Bewertung: 0 von 5 Sternen0 BewertungenEinstieg in ChatGPT: Künstliche Intelligenz verstehen und nutzen: Ein praktischer Ratgeber für Einsteiger Bewertung: 0 von 5 Sternen0 Bewertungen...Als die Noten laufen lernten...Band 2: Kabarett-Operette-Revue-Film-Exil. Unterhaltungsmusik bis 1945 Bewertung: 0 von 5 Sternen0 BewertungenMachine Learning – kurz & gut: Eine Einführung mit Python, Pandas und Scikit-Learn Bewertung: 5 von 5 Sternen5/5Big Data: Die neue Intelligenz des Menschen (GEO eBook) Bewertung: 0 von 5 Sternen0 BewertungenData Warehouse im Rahmen der Business Intelligence: Konzeption eines Vorgehensmodells Bewertung: 0 von 5 Sternen0 BewertungenDatenbanken: Grundlagen und Entwurf Bewertung: 0 von 5 Sternen0 BewertungenAnglizismen und andere "Fremdwords" deutsch erklärt: Über 1000 aktuelle Begriffe Bewertung: 0 von 5 Sternen0 BewertungenISO27001/ISO27002: Ein Taschenführer Bewertung: 0 von 5 Sternen0 BewertungenUnterirdisches Slowenien: Ein Exkursionsführer zu den Höhlen des Klassischen Karstes Bewertung: 0 von 5 Sternen0 BewertungenRaspberry Pi Kinderleicht: Pi 4 mit 8 GB Bewertung: 0 von 5 Sternen0 BewertungenDocker und die Containerwelt: Einstieg und Expertentipps rund um Docker-Container Bewertung: 1 von 5 Sternen1/5
Rezensionen für Handbuch Infrastructure as Code
0 Bewertungen0 Rezensionen
Buchvorschau
Handbuch Infrastructure as Code - Kief Morris
TEIL I
Grundlagen
KAPITEL 1
Was ist Infrastructure as Code?
Arbeiten Sie in einem Team, das IT-Infrastruktur erstellt und betreibt, sollten Ihnen Automatisierungstechniken für Cloud und Infrastruktur dabei helfen, in weniger Zeit zuverlässiger mehr Wert bieten zu können. Aber in der Praxis geht es vor allem darum, die stetig zunehmende Größe, Komplexität und Diversität der verschiedenen Elemente im Griff zu behalten.
Diese Technologien sind besonders relevant, wenn Organisationen digital werden. Wenn Business-Menschen »Digital« sagen, meinen sie damit, dass Softwaresysteme für das, was die Organisation tut, von zentraler Bedeutung sind.¹ Der Wechsel ins Digitale verstärkt den Druck auf Sie, mehr Aufgaben schneller zu erledigen. Sie müssen zusätzliche Services hinzufügen und betreuen. Mehr Business-Aktivitäten. Mehr Mitarbeiterinnen und Mitarbeiter. Mehr Kundinnen und Kunden, Lieferpartner und andere Stakeholder.
Cloud- und Automatisierungs-Tools helfen dabei, es viel leichter zu machen, Infrastruktur hinzuzufügen und anzupassen. Aber viele Teams haben Probleme damit, ausreichend Zeit dafür zu finden, mit der schon vorhandenen Infrastruktur Schritt zu halten. Da ist es nicht sehr hilfreich, das Erstellen von noch mehr Infrastruktur einfacher zu machen. Einer meiner Kunden sagte mir: »Durch Cloud wurden die Barrieren eingerissen, die unseren Reifenbrand unter Kontrolle behielten.«²
Viele haben auf die Drohung eines ausufernden Chaos durch ein Anziehen ihres Änderungsmanagement-Prozesses reagiert. Sie haben die Hoffnung, dass sich das Chaos durch Begrenzen und Kontrollieren der Änderungen vermeiden lässt. Also legen sie die Cloud in Ketten.
Damit gibt es zwei Probleme. Das eine ist, dass so die Vorteile der Cloud-Technologien verloren gehen, das andere, dass die Benutzerinnen und Benutzer die Vorteile der Cloud-Technologie auch haben wollen. So ist man bemüht, die Personen zu umgehen, die versuchen, das Chaos im Griff zu behalten. Im schlimmsten Fall wird das Risikomanagement vollständig ignoriert, und man entscheidet für sich, dass das in der schönen neuen Cloud-Welt nicht notwendig sei. Sie setzen auf Cowboy-IT, was zu verschiedenen Problemen führt.¹
Die Prämisse dieses Buchs ist, dass Sie Cloud- und Automatisierungs-Technologie nutzen können, um Änderungen einfach, sicher, schnell und verantwortungsbewusst durchführen zu können. Diese Vorteile entstehen nicht automatisch durch den Einsatz von Automatisierungs-Werkzeugen oder Cloud-Plattformen. Sie hängen davon ab, wie Sie diese Technologie verwenden.
In diesem Kapitel erkläre ich, dass moderne, dynamische Infrastruktur eine Mentalität aus dem »Cloud-Zeitalter« erfordert. Die Mentalität unterscheidet sich grundlegend vom klassischen »Eisenzeit«-Ansatz, den wir bei statischen Prä-Cloud-Systemen genutzt haben. Ich definiere drei zentrale Praktiken für das Implementieren von Infrastructure as Code: Definiere alles als Code, teste und liefere alles fortlaufend während des Entwickelns aus und baue das System aus kleinen, lose gekoppelten Elementen auf.
Ich beschreibe zudem in diesem Kapitel die Gründe für den »Cloud-Zeitalter«-Ansatz zur Infrastruktur. Dieser löst sich von der fälschlich angenommenen Gegensätzlichkeit von Geschwindigkeit und Qualität, die man gegeneinander abwägen müsse. Stattdessen nutzen wir die Geschwindigkeit als eine Möglichkeit, die Qualität zu verbessern, und die Qualität, um mit hoher Geschwindigkeit auszuliefern.
Aus der Eisenzeit in das Cloud-Zeitalter
Technologie des Cloud-Zeitalters ermöglicht ein schnelleres Provisionieren und Ändern von Infrastruktur, als dies mit den klassischen Technologien aus der Eisenzeit möglich wäre (Tabelle 1-1).
Tabelle 1-1: Technologische Änderungen im Cloud-Zeitalter
Aber diese Technologien machen es nicht notwendigerweise einfacher, Ihre Systeme zu managen und wachsen zu lassen. Überführen Sie ein System mit technischen Schulden (https://oreil.ly/3AqHB) in eine schrankenlose Cloud-Infrastruktur, beschleunigen Sie nur das Chaos.
Vielleicht konnten Sie auf bewährte, klassische Governance-Modelle zurückgreifen, um die Geschwindigkeit und das Chaos zu kontrollieren, das neuere Technologien mit sich bringen. Ein umfassendes, vorher ausgearbeitetes Design, rigorose Change Reviews und strikt getrennte Zuständigkeiten werden schon für Ordnung sorgen!
Aber leider sind diese Modelle für die Eisenzeit optimiert, in der Änderungen langsam und teuer sind. Sie sorgen für zusätzlichen Aufwand im Vorhinein mit der Hoffnung, später den Zeitaufwand für die Änderung zu verringern. Das ist durchaus sinnvoll, wenn es später teuer und langsam ist, Änderungen vorzunehmen. Aber durch die Cloud werden Änderungen schnell und günstig. Sie sollten diese Geschwindigkeit zu Ihrem Vorteil nutzen, um kontinuierlich zu lernen und Ihr System zu verbessern. Arbeiten Sie weiter wie in der Eisenzeit, sind Ihr Lernen und Ihre Verbesserungen massiv eingeschränkt.
Statt also langsame Prozesse aus der Eisenzeit auf schnellere Technologie des Cloud-Zeitalters anzuwenden, sollten Sie eine neue Mentalität übernehmen. Nutzen Sie eine schnellere Technologie, um Risiken zu verringern und die Qualität zu verbessern. Das erfordert einen grundlegend anderen Ansatz und neue Wege, über Änderungen und Risiken nachzudenken (Tabelle 1-2).
Tabelle 1-2: Arbeitsweisen im Cloud-Zeitalter
Infrastructure as Code
Infrastructure as Code ist ein Ansatz für die Infrastruktur-Automatisierung, der auf Praktiken aus der Softwareentwicklung basiert. Er baut auf konsistenten, wiederholbaren Routinen zum Provisionieren und zur Änderung von Systemen und deren Konfiguration auf. Sie nehmen Änderungen am Code vor und nutzen dann Automation, um diese Änderungen zu testen und auf Ihre Systeme anzuwenden.
In diesem Buch erläutere ich, wie Sie agile Entwicklungspraktiken wie Test-driven Development (TDD), Continuous Integration (CI) und Continuous Delivery (CD) nutzen können, um das Ändern von Infrastruktur schnell und sicher zu gestalten. Ich beschreibe zudem, wie ein modernes Softwaredesign für resiliente, gut gewartete Infrastruktur sorgen kann. Diese Praktiken und Design-Ansätze unterstützen sich gegenseitig. Gut designte Infrastruktur lässt sich leichter testen und bereitstellen. Automatisiertes Testen und Bereitstellen führt zu einfacherem und saubererem Design.
Vorteile von Infrastructure as Code
Zusammengefasst kann man sagen, dass Organisationen, die Infrastructure as Code nutzen, um dynamische Infrastruktur zu verwalten, unter anderem auf Folgendes hoffen:
Mit der IT-Infrastruktur ein schnelles Bereitstellen von Werten ermöglichen.
Aufwand und Risiken von Änderungen an der Infrastruktur reduzieren.
Anwenderinnen und Anwender der Infrastruktur dazu befähigen, die notwendigen Ressourcen dann zu bekommen, wenn sie sie brauchen.
Gemeinsame Werkzeuge für Entwicklung, Operations und andere Stakeholder bereitstellen.
Systeme aufbauen, die zuverlässig, sicher und kostengünstig sind.
Steuerelemente für Governance, Sicherheit und Compliance sichtbar machen.
Die Geschwindigkeit verbessern, mit der Fehler gefunden und gelöst werden.
Infrastructure as Code nutzen, um für Änderungen zu optimieren
Angesichts dessen, dass Änderungen das größte Risiko für ein Produktivsystem sind, sich kontinuierliche Änderungen nicht vermeiden lassen und ein System nur durch Änderungen verbesserbar ist, ist es sinnvoll, Ihre Fähigkeit zu optimieren, Änderungen sowohl schnell als auch zuverlässig zu machen.¹ Die Forschungsergebnisse im Accelerated State of DevOps Report unterstützen diese Ansicht. Häufige und zuverlässige Änderungen korrelieren mit dem Erfolg von Organisationen.²
Es gibt eine Reihe von Einwänden, die ich zu hören bekomme, wenn ich einem Team empfehle, zum Optimieren von Änderungen Automation einzuführen. Ich glaube, diese entstehen aus Missverständnissen, wie Sie Automation verwenden können und sollten.
Einwand »Wir haben gar nicht so häufig Änderungen, sodass sich Automation nicht lohnt«
Wir möchten gerne glauben, dass wir ein System bauen, und dann ist es »fertig«. Bei einer solchen Sichtweise nehmen wir nicht viele Änderungen vor, daher ist das Automatisieren von Änderungen nur Zeitverschwendung.
In der Realität gibt es nur an sehr wenigen Systemen keine Veränderungen mehr – zumindest nicht, bevor sie ausgemustert werden. Manche gehen davon aus, dass die aktuelle Menge an Änderungen nur vorübergehend ist. Andere schaffen aufwendige Prozesse zum Änderungsmanagement, um Personen davon abzuhalten, nach Änderungen zu fragen. Aber diejenigen reden es sich schön. Die meisten Teams, die aktiv genutzte Systeme betreuen, haben es mit einem kontinuierlichen Strom von Änderungen zu tun.
Denken Sie nur an die folgenden Beispiele für Änderungen an der Infrastruktur:
Ein wichtiges neues Anwendungsfeature erfordert das Hinzufügen einer neuen Datenbank.
Für ein neues Anwendungsfeature muss der Anwendungsserver aktualisiert werden.
Die App wird häufiger genutzt als erwartet. Sie brauchen mehr Server, neue Cluster und zusätzliche Networking- und Storage-Kapazitäten.
Beim Performance-Profiling zeigt sich, dass die aktuelle Deployment-Architektur für die Anwendung die Performance einschränkt. Sie müssen die Anwendungen auf mehrere andere Anwendungsserver neu deployen. Dazu sind Änderungen am Clustering und an der Netzwerk-Architektur erforderlich.
Es gibt eine neu bekannt gewordene Sicherheitslücke in Systempaketen für Ihr Betriebssystem. Sie müssen dutzende Produktivserver patchen.
Sie müssen Server aktualisieren, auf denen veraltete Versionen des Betriebssystems und zentraler Pakete laufen.
Auf Ihren Webservern gibt es immer wieder Aussetzer. Sie müssen eine Reihe von Konfigurationsänderungen vornehmen, um das Problem untersuchen zu können. Dann müssen Sie ein Modul aktualisieren, um das Problem zu lösen.
Sie finden eine Konfigurationsänderung, die die Performance Ihrer Datenbank verbessert.
Eine zentrale Wahrheit des Cloud-Zeitalters ist: Stabilität entsteht durch Änderungen.
Ungepatchte Systeme sind nicht stabil – sie sind angreifbar. Können Sie Probleme nicht beheben, sobald Sie sie finden, ist Ihr System nicht stabil. Können Sie nach einem Ausfall nicht schnell wieder auf die Füße kommen, ist Ihr System nicht stabil. Wenn für Ihre Änderungen eine deutliche Downtime erforderlich ist, ist Ihr System nicht stabil. Wenn Änderungen immer wieder fehlschlagen, ist Ihr System nicht stabil.
Einwand »Wir sollten erst bauen und danach automatisieren«
Wenn Sie mit Infrastructure as Code beginnen, haben Sie eine steile Lernkurve vor sich. Das Aufsetzen der Tools, Services und Arbeitsweisen zum Automatisieren der Infrastruktur-Bereitstellung erfordert viel Arbeit, insbesondere, wenn Sie sich gleichzeitig auch noch in eine neue Infrastruktur-Plattform einarbeiten. Der Wert dieser Arbeit wird erst dann sichtbar, wenn Sie beginnen, Services damit zu bauen und zu deployen. Und auch dann wird er eventuell denen nicht deutlich werden, die nicht direkt mit der Infrastruktur arbeiten.
Stakeholder drängen Infrastruktur-Teams oft dazu, schnell und mal eben manuell neue in der Cloud gehostete Systeme zu bauen und sich erst später um das Automatisieren zu kümmern.
Es gibt drei Gründe dafür, warum das eine schlechte Idee ist:
Durch die Automation sollte das Bereitstellen schneller gehen, auch für neue Elemente. Implementieren Sie die Automation erst, nachdem ein Großteil der Arbeit erledigt ist, opfern Sie viele der Vorteile.
Automation erleichtert das Schreiben automatisierter Tests für das, was Sie bauen. Und sie macht es einfacher, etwas schnell zu korrigieren und neu zu bauen, wenn Sie Probleme finden. Wenn Sie dies als Teil des Build-Prozesses tun, hilft es Ihnen dabei, eine bessere Infrastruktur zu bauen.
Das Automatisieren eines bestehenden Systems ist sehr schwer. Automation ist Teil des Designs und der Implementierung eines Systems. Um ein System, das ohne Automation aufgebaut wurde, um diese zu ergänzen, müssen Sie das Design und die Implementierung des Systems deutlich anpassen. Das gilt auch für das automatisierte Testen und Deployen.
Cloud-Infrastruktur, die ohne Automation aufgebaut wurde, müssen Sie schneller abschreiben, als Sie denken. Die Kosten für das manuelle Warten und Beheben von Fehlern im System können schnell deutlich wachsen. Ist der Service, der darauf läuft, erfolgreich, werden Sie die Stakeholder dazu drängen, ihn zu erweitern und neue Features hinzuzufügen, statt innezuhalten, um ihn neu zu bauen.
Das Gleiche gilt, wenn Sie ein System als Experiment bauen. Haben Sie einen Proof of Concept zum Laufen gebracht, wird es den Druck geben, sich mit dem nächsten Thema zu beschäftigen, statt zurückzukehren und das System richtig neu zu bauen. Und eigentlich sollte Automation auch Teil des Experiments sein. Wollen Sie Automation zum Managen Ihrer Infrastruktur einsetzen, müssen Sie verstehen, wie das funktionieren wird, daher sollte es auch Teil Ihres Proof of Concept sein.
Die Lösung besteht darin, Ihr System inkrementell aufzubauen und die Automation direkt mit zu berücksichtigen. Stellen Sie sicher, dass Sie Werte bieten, während Sie gleichzeitig für die Möglichkeit sorgen, das kontinuierlich zu tun.
Einwand »Wir müssen zwischen Geschwindigkeit und Qualität entscheiden«
Es ist ganz natürlich, davon auszugehen, dass Sie nur dann schnell vorankommen können, wenn Sie Abstriche bei der Qualität machen, und dass Sie nur dann Qualität erhalten, wenn Sie sich langsam bewegen. Sie sehen das vielleicht als Kontinuum (siehe Abbildung 1-1).
Abbildung 1-1: Die Idee, dass sich Geschwindigkeit und Qualität an entgegengesetzten Enden eines Spektrums befinden, ist eine fälschlich angenommene Gegensätzlichkeit.
Die Accelerate-Forschungsdaten, die ich weiter oben erwähnt habe (siehe »Infrastructure as Code nutzen, um für Änderungen zu optimieren« auf Seite 35), zeigen aber etwas anderes:
Diese Ergebnisse zeigen, dass es keinen Kompromiss zwischen dem Verbessern der Performance und dem Erreichen einer besseren Stabilität und Qualität gibt. Stattdessen sind High-Performer bei all diesen Messwerten besser. Das ist genau das, was die Agile- und Lean-Bewegungen predigen, aber ein Glaubenssatz in unserer Branche basiert immer noch auf der falschen Annahme, dass man ein schnelles Vorankommen gegen andere Performance-Ziele abwägen muss, statt alles zu unterstützen und sich gegenseitig verstärken zu lassen.
– Nicole Forsgren, PhD, Accelerate
Kurz gesagt können Organisationen nicht wählen, ob sie entweder Veränderungen oder Stabilität gut hinbekommen. Sie tendieren dazu, entweder in beidem gut oder in beidem schlecht zu sein.
Ich ziehe es vor, Qualität und Geschwindigkeit als Quadrant statt als Kontinuum zu betrachten,¹ wie in Abbildung 1-2 zu sehen ist.
Abbildung 1-2: Geschwindigkeit und Qualität auf Quadranten abgebildet
Dieses Quadrantenmodell zeigt, warum es auf jeden Fall zu Mittelmäßigkeit führen wird, wenn man versucht, zwischen Geschwindigkeit und Qualität zu wählen:
Unterer rechter Quadrant: Geschwindigkeit gegenüber Qualität priorisieren
Das ist die Philosophie »move fast and break things«. Teams, die auf Geschwindigkeit optimieren und dafür die Qualität opfern, schaffen chaotische, fragile Systeme. Sie rutschen in den linken unteren Quadranten, weil sie von ihren schlampigen Systemen ausgebremst werden. Viele Start-ups, die eine Zeitlang so gearbeitet haben, beschweren sich darüber, ihr »Mojo« zu verlieren. Einfache Änderungen, die sie in der guten alten Zeit mal eben rausgehauen hätten, brauchen jetzt Tage oder Wochen, weil das System ein verworrenes Chaos ist.
Oberer linker Quadrant: Qualität gegenüber Geschwindigkeit priorisieren
Auch bekannt als »wir haben es hier mit ernsthaften und wichtigen Dingen zu tun, daher müssen wir es richtig machen«. Der Druck von Deadlines führt dann zu »Workarounds«. Aufwendige Prozesse schaffen Hürden für Verbesserungen, daher wachsen die technischen Schulden zusammen mit der Liste der »bekannten Probleme«. Diese Teams rutschen in den linken unteren Quadranten. Sie landen bei Systemen schlechter Qualität, weil es zu schwer ist, sie zu verbessern. Als Reaktion auf Fehler führen sie noch mehr Prozesse ein. Diese Prozesse machen es noch schwerer, Verbesserungen umzusetzen, und sorgen so für zusätzliche Fragilität und Risiken. Das führt zu mehr Fehlern und mehr Prozessen. Viele Personen, die in so agierenden Organisationen tätig sind, gehen davon aus, dass das normal ist¹ – insbesondere, wenn sie in risikosensiblen Branchen unterwegs sind.²
Der obere rechte Quadrant ist das Ziel moderner Ansätze wie Lean, Agile und DevOps. Sich schnell bewegen und ein hohes Qualitätsniveau beibehalten zu können, scheint wie ein Traum zu wirken. Aber die Accelerate-Forschung zeigt, dass viele Teams das erreichen. Daher finden Sie in diesem Quadranten »High Performer«.
Die Four Key Metrics
DORAs Accelerate-Forschungsteam hat vier zentrale Metriken für die Performance der Softwareauslieferung und von Operations identifiziert.³ Dafür wurden diverse Messwerte begutachtet, und es wurde herausgefunden, dass diese vier die stärkste Korrelation dazu haben, wie gut eine Organisation ihre Ziele erreicht:
Auslieferungsdurchlaufzeit
Die Zeit, die erforderlich ist, um Änderungen am Produktivsystem zu implementieren, zu testen und auszuliefern.
Deployment-Häufigkeit
Wie oft Sie Änderungen an Produktivsystemen deployen.
Anteil an Änderungsfehlschlägen
Welcher Prozentsatz an Änderungen entweder einen Service beeinträchtigt hat oder eine sofortige Korrektur erforderte, wie zum Beispiel ein Rollback oder ein Notfall-Fix.
Mean Time to Recovery (MTTR)
Wie lange es dauert, einen Service wiederherzustellen, wenn es einen ungeplanten Ausfall oder eine Beeinträchtigung gibt.
Organisationen, die ihre Ziele gut erreichen – seien es der Umsatz, der Aktienpreis oder andere Kriterien – funktionieren auch gut in Bezug auf diese vier Metriken und umgekehrt. Die Ideen in diesem Buch sollen Ihrem Team und Ihrer Organisation dabei helfen, diese Metriken gut zu erfüllen. Drei zentrale Praktiken für Infrastructure as Code können Sie dabei unterstützen.
Drei zentrale Praktiken für Infrastructure as Code
Das Konzept des Cloud-Zeitalters nutzt die dynamische Natur moderner Infrastruktur- und Anwendungsplattformen aus, um häufig und zuverlässig Änderungen durchführen zu können. Infrastructure as Code ist ein Ansatz, mit dem Sie Infrastruktur bauen, die kontinuierliche Änderungen unterstützt, um eine hohe Zuverlässigkeit und Qualität zu erreichen. Wie kann Ihr Team das schaffen?
Es gibt drei zentrale Praktiken beim Implementieren von Infrastructure as Code:
Definieren Sie alles als Code.
Testen Sie all Ihre aktuelle Arbeit kontinuierlich und liefern Sie sie aus.
Bauen Sie kleine, einfache Einheiten, die Sie unabhängig voneinander austauschen können.
Ich werde jede dieser Thesen nun vorstellen, um den Rahmen für weitere Diskussionen vorzugeben. Im weiteren Verlauf des Buchs werde ich dann jeweils in einem eigenen Kapitel die Prinzipien für das Implementieren dieser drei Praktiken ausführlich erläutern.
Zentrale Praktik: Definieren Sie alles als Code
Es ist eine zentrale Praktik für zügige und zuverlässige Änderungen, alles »als Code« zu definieren. Es gibt dafür ein paar Gründe:
Wiederverwendbarkeit
Definieren Sie etwas als Code, können Sie viele Instanzen davon erzeugen. Sie können Ihre Elemente reparieren und schnell neu bauen, und andere Personen können identische Instanzen des Elements erzeugen.
Konsistenz
Elemente, die aus Code gebaut werden, werden jedes Mal gleich gebaut. Dadurch wird das Verhalten von Systemen vorhersagbar, das Testen zuverlässiger und es werden kontinuierliches Testen und Ausliefern möglich.
Transparenz
Alle können sehen, wie ein Element gebaut wird, indem sie sich den Code anschauen. Die Leute können den Code begutachten und Verbesserungen vorschlagen. Sie können daraus lernen, um Elemente im eigenen Code einzusetzen, Einblicke für das Troubleshooting liefern und zu Compliance-Zwecken Reviews und Audits durchführen.
Ich werde in Kapitel 4 genauer auf die Konzepte und Implementierungs-Prinzipien zum Definieren von Elementen als Code eingehen.
Zentrale Praktik: Kontinuierliches Testen und die gesamte aktuelle Arbeit ausliefern
Effektive Infrastruktur-Teams sind beim Testen rigoros. Sie nutzen Automation, um jede Komponente ihres Systems zu deployen und zu testen, und sie integrieren die gesamte aktuelle Arbeit. Sie testen schon während der Arbeit, statt zu warten, bis sie fertig sind.
Die Idee ist, Qualität einzubauen, statt zu versuchen, die Qualität zu testen.
Dabei wird gerne übersehen, dass dazu das Integrieren und Testen der gesamten aktuellen Arbeit gehört. Bei vielen Teams arbeiten die Entwicklerinnen und Entwickler am Code in eigenen Branches und integrieren erst, wenn sie fertig sind. Laut den Forschungsergebnissen von Accelerate liefern Teams allerdings bessere Ergebnisse, wenn sie ihre Arbeit mindestens täglich integrieren. Zum CI gehört das Mergen und Testen des Codes aller Beteiligten während des Entwickelns. CD geht noch einen Schritt weiter und sorgt dafür, dass der gemergte Code immer bereit für die Produktivumgebung ist.
Details zum kontinuierlichen Testen und Ausliefern von Infrastruktur-Code finden Sie in Kapitel 8.
Zentrale Praktik: Kleine einfache Elemente bauen, die Sie unabhängig voneinander ändern können
Teams bekommen Probleme, wenn ihre Systeme groß und eng gekoppelt sind. Je größer ein System ist, desto schwieriger wird es, es zu ändern, und umso einfacher kann man es zerstören.
Schauen Sie sich die Codebasis eines leistungsfähigen Teams an, sehen Sie den Unterschied. Das System ist aus kleinen, einfachen Elementen aufgebaut. Jedes Element lässt sich leicht verstehen, und es besitzt sauber definierte Schnittstellen. Das Team kann jede Komponente für sich einfach ändern und jede Komponente isoliert deployen und testen.
Genauer gehe ich auf die Implementierungsprinzipien dieser zentralen Praktik in Kapitel 15 ein.
Zusammenfassung
Um etwas aus der Cloud- und Infrastruktur-Automation herauszuholen, benötigen Sie eine Mentalität, die zum Cloud-Zeitalter passt. Sie müssen dafür die Geschwindigkeit ausnutzen, um die Qualität zu verbessern, und Qualität einbauen, um Geschwindigkeit aufzunehmen. Es ist Arbeit, Ihre Infrastruktur zu automatisieren, insbesondere wenn Sie erst lernen, wie Sie das tun können. Aber es hilft Ihnen dabei, Änderungen vorzunehmen – und vor allem, das System überhaupt zu bauen.
Ich habe die Elemente eines typischen Infrastruktur-Systems beschrieben, da diese die Grundlage für die Kapitel legen, in denen erklärt wird, wie Sie Infrastructure as Code implementieren.
Schließlich habe ich drei zentrale Praktiken für Infrastructure as Code beschrieben: Definieren Sie alles als Code, testen und liefern Sie kontinuierlich und bauen Sie kleine Elemente.
KAPITEL 2
Prinzipien der Infrastruktur im Cloud-Zeitalter
In der Eisenzeit der IT waren Rechenressourcen eng mit der physischen Hardware verbunden. Wir haben CPUs, Speicher und Festplatten in einem Gehäuse verbaut, es in einem Rack montiert und mit Switches und Routern verkabelt. Wir haben ein Betriebssystem und Anwendungssoftware installiert und konfiguriert. Wir konnten beschreiben, wo sich ein Anwendungsserver im Datacenter befand: welche Etage, welche Reihe, welches Rack, welcher Slot.
Das Cloud-Zeitalter entkoppelt die Rechenressourcen von der physischen Hardware, auf der sie laufen. Natürlich gibt es die Hardware noch, aber Server, Festplatten und Router verteilen sich darauf. Es gibt keine physikalischen Elemente mehr, denn diese wurden in virtuelle Konstrukte umgewandelt, die wir nach Wunsch erstellen, kopieren, ändern und wieder löschen.
Diese Transformation hat uns dazu gezwungen, unsere Denkweise über Rechenressourcen sowie ihr Design und ihren Einsatz anzupassen. Wir können uns nicht mehr darauf verlassen, dass die physischen Attribute unseres Anwendungsservers konstant sind. Wir müssen Instanzen unserer Systeme ohne großen Aufwand hinzufügen und entfernen können und wir müssen dazu in der Lage sein, die Konsistenz und Qualität unserer Systeme beizubehalten, auch wenn wir sie massiv ausbauen.
Es gibt eine Reihe von Prinzipien zum Designen und Implementieren von Infrastruktur auf Cloud-Plattformen. Diese liefern die Gründe für die drei zentralen Praktiken (definieren Sie alles als Code, testen und liefern Sie kontinuierlich, bauen Sie kleine Einheiten). Ich erwähne auch eine Reihe von Fallstricken, über die Teams mit dynamischer Infrastruktur häufig stolpern.
Diese Prinzipien und Fallstricke bilden die Grundlage für die spezifischen Ratschläge zum Implementieren der Infrastruktur-als-Code-Praktiken in diesem Buch.
Prinzip: Gehen Sie davon aus, dass Systeme unzuverlässig sind
In der Eisenzeit sind wir davon ausgegangen, dass unsere Systeme auf zuverlässiger Hardware laufen. Im Cloud-Zeitalter müssen Sie davon ausgehen, dass Ihre Systeme auf unzuverlässiger Hardware laufen.¹
Infrastruktur im Cloud-Maßstab nutzt Hunderttausende Devices, wenn nicht mehr. In dieser Größenordnung kommt es selbst dann zu Ausfällen, wenn Sie zuverlässige Hardware einsetzen – und die meisten Cloud-Anbieter greifen auf günstige, weniger zuverlässige Hardware zurück, überwachen diese und ersetzen sie bei einem Fehler.
Sie werden Teile Ihres Systems aber auch nicht nur offline nehmen müssen, wenn es zu ungeplanten Ausfällen kommt. Sie müssen Patches einspielen und Systeme aktualisieren. Sie werden die Größe anpassen, Last neu verteilen und Probleme analysieren.
Bei statischer Infrastruktur müssen Sie dafür Systeme offline nehmen. Aber in vielen modernen Organisationen heißt das auch, dass damit das Business offline ist.
Sie können also die Infrastruktur, auf der Ihr System läuft, nicht als stabile Grundlage betrachten. Stattdessen müssen Sie so designen, dass ein ununterbrochener Service auch dann möglich ist, wenn sich die zugrunde liegenden Ressourcen ändern.²
Prinzip: Alles reproduzierbar machen
Um ein System wiederherstellbar zu machen, ist eine Möglichkeit, sicherzustellen, dass Sie seine Elemente mühelos und zuverlässig neu bauen können.
Mühelos bedeutet, dass Sie keine Entscheidungen treffen müssen, wie Sie etwas bauen. Sie sollten Elemente wie Konfigurationseinstellungen, Softwareversionen oder Abhängigkeiten als Code definieren. Das erneute Bauen ist dann eine einfache »Ja/Nein«-Entscheidung.
Reproduzierbarkeit erleichtert es nicht nur, ein ausgefallenes System wiederherzustellen, sie hilft Ihnen auch bei Folgendem:
Testumgebungen sind konsistent zur Produktivumgebung.
Systeme lassen sich für eine bessere Verfügbarkeit über Regionen hinweg replizieren.
Instanzen können bei Bedarf hinzugefügt werden, um hohe Lasten abzufedern.
Systeme lassen sich replizieren, um jedem Kunden eine eigene Instanz zu bieten.
Natürlich erzeugt das System Daten, Inhalte und Logs, die Sie nicht im Voraus definieren können. Sie müssen diese identifizieren und Wege finden, sie als Teil Ihrer Replikationsstrategie zu berücksichtigen. Das kann eventuell ganz einfach sein – Daten auf ein Backup kopieren oder streamen und dann beim erneuten Bauen wiederherstellen. Ich beschreibe entsprechende Möglichkeiten in »Datenkontinuität in einem sich ändernden System« auf Seite 430.
Die Möglichkeit, mühelos jeden Teil der Infrastruktur erstmalig oder erneut zu bauen, ist sehr mächtig. Sie nimmt die Risiken und Ängste bei Änderungen, und Sie können Ausfälle zuversichtlich angehen. Neue Services und Umgebungen lassen sich schnell provisionieren.
Fallstrick: Snowflake-Systeme
Eine Snowflake ist eine Instanz eines Systems oder eines Systemteils, die sich nur schwer erneut bauen lässt. Es kann sich auch um eine Umgebung handeln, die anderen Umgebungen möglichst gleichen soll – zum Beispiel eine Staging-Umgebung –, die sich aber auf eine Art und Weise unterscheidet, die vom Team nicht vollständig verstanden wird.
Niemand hat vor, Snowflake-Systeme zu bauen. Sie entstehen einfach ganz natürlich. Wenn Sie mit einem neuen Tool das erste Mal etwas bauen, machen Sie dabei Erfahrungen und auch Fehler. Aber wenn sich die Leute auf das verlassen, was Sie gebaut haben, haben Sie vielleicht nicht die Zeit, einen Schritt zurückzugehen und das Ganze erneut zu bauen und dabei zu verbessern oder die gemachten Erfahrungen einfließen zu lassen. Es ist besonders schwer, schon gebaute Elemente zu verbessern, wenn Sie nicht die Mechanismen und Praktiken verfügen, die Änderungen einfach und sicher machen.
Ein weiterer Grund für Snowflakes besteht darin, dass Entwicklerinnen und Entwickler Änderungen an nur einer Instanz eines Systems machen, die anderen Instanzen aber unverändert bleiben. Vielleicht stehen sie gerade unter dem Druck, ein Problem zu beheben, das nur in einem System auftaucht, oder sie beginnen mit einem großen Upgrade in einer Testumgebung, haben aber nicht mehr die Zeit, es in andere Umgebungen auszurollen.
Sie wissen, dass ein System eine Snowflake ist, wenn Sie nicht davon ausgehen können, es sicher zu ändern oder zu aktualisieren. Schlimmer noch: Wenn das System ausfällt, wird es schwer, es zu reparieren. Daher vermeidet man, solch ein System zu ändern, wodurch es veraltet, keine Patches mehr bekommt und vielleicht sogar teilweise nicht mehr nutzbar ist.
Snowflake-Systeme sorgen für Risiken und verschwenden die Zeit der Teams, die sie betreuen. Es lohnt sich fast immer, sie durch reproduzierbare Systeme zu ersetzen. Lohnt es sich nicht, ein Snowflake-System zu verbessern, ist es es vielleicht auch nicht wert, es überhaupt noch zu behalten.
Am besten ersetzen Sie ein Snowflake-System, indem Sie Code schreiben, der das System replizieren kann, und das neue System parallel laufen lassen, bis es bereit ist. Nutzen Sie automatisierte Tests und Pipelines, um zu zeigen, dass das System korrekt und reproduzierbar ist, dann können Sie es leicht anpassen.
Prinzip: Erstellen Sie wegwerfbare Elemente
Es ist eine Sache, ein System zu bauen, das mit dynamischer Infrastruktur umgehen kann. Es ist aber etwas ganz anderes, ein System zu bauen, das selbst dynamisch ist. Sie sollten die Teile Ihres Systems elegant hinzufügen, entfernen, starten, stoppen, ändern und bewegen können. Das schafft operationelle Flexibilität, Verfügbarkeit und Skalierbarkeit. Zudem vereinfacht es Änderungen und reduziert Risiken.
Es ist die zentrale Idee von Cloud-nativer Software, die Elemente Ihres Systems formbar zu gestalten. Die Cloud abstrahiert Infrastruktur-Ressourcen (Rechenleistung, Networking und Storage) von der physischen Hardware. Cloud-native Software entkoppelt die Anwendungsfunktionalität vollständig von der Infrastruktur, auf der sie läuft.¹
Sind Ihre Systeme dynamisch, müssen die Werkzeuge, mit denen Sie sie managen, das berücksichtigen. So sollte Ihr Monitoring nicht jedes Mal einen Alert ausgeben, wenn Sie Teile Ihres Systems umbauen. Aber es sollte Sie warnen, wenn etwas in einer Endlosschleife immer wieder neu gebaut wird.
Der Fall des verschwundenen Dateiservers
Manche Entwicklerinnen und Entwickler können eine Weile brauchen, um sich an flüchtige Hardware zu gewöhnen. Ein Team, mit dem ich zusammenarbeitete, setzte die Infrastruktur automatisiert mit VMware und Chef auf. Es löschte und ersetzte virtuelle Maschinen nach Bedarf.
Ein neuer Entwickler im Team benötigte einen Webserver, um Dateien zu hosten, die gemeinsam mit Teamkolleginnen und -kollegen genutzt werden sollten. Also installierte er manuell einen HTTP-Server auf einem Entwicklungsserver und schob die Dateien dorthin. Ein paar Tage später habe ich die VM neu gebaut, und sein Webserver verschwand.
Nach einiger Verwirrung verstand der Entwickler, warum das geschehen war. Er ergänzte seinen Webserver im Chef-Code und persistierte seine Dateien auf dem SAN. Das Team besaß nun einen zuverlässigen Service zum gemeinsamen Zugriff auf Dateien.
Prinzip: Variationen minimieren
Wenn ein System wächst, lässt es sich schwerer verstehen, schwerer ändern und schwerer korrigieren. Die Menge an Arbeit wächst mit der Anzahl der Elemente, aber auch mit der Anzahl der verschiedenen Arten von Elementen. Um ein System handhabbar zu halten, ist es daher sinnvoll, nicht zu viele verschiedene Elemente zu haben – um die Variationen gering zu halten. Es ist einfacher, einhundert identische als fünf völlig verschiedene Server zu warten.
Das Prinzip der Reproduzierbarkeit (siehe »Prinzip: Alles reproduzierbar machen« auf Seite 44) ergänzt diese Idee. Definieren Sie eine einfache Komponente und erstellen davon viele identische Instanzen, können Sie sie leicht verstehen, ändern und korrigieren.
Damit das funktioniert, müssen Sie jede Änderung auf alle Instanzen der Komponente anwenden. Denn ansonsten erzeugen Sie Konfigurationsdrift.
Dies sind ein paar Arten von Variationen, die es in Ihren Systemen geben kann:
Mehrere Betriebssysteme, Anwendungs-Runtimes, Datenbanken und andere Technologien. Für jede davon benötigen Sie Personen in Ihrem Team, die sich diesbezüglich auf dem Laufenden halten und Wissen erwerben.
Mehrere Versionen einer Software, wie zum Beispiel ein Betriebssystem oder eine Datenbank. Selbst wenn Sie nur ein Betriebssystem nutzen, kann jede Version eine andere Konfiguration und andere Werkzeuge erfordern.
Unterschiedliche Versionen eines Pakets. Haben manche Server eine neuere Version eines Pakets, Tools oder einer Bibliothek als andere, besteht ein Risiko. Vielleicht laufen bestimmte Befehle nicht überall gleich, oder ältere Versionen besitzen Sicherheitslücken oder Bugs.
Organisationen müssen einen Weg finden, es jedem Team zu erlauben, die Technologien und Lösungen zu wählen, die seine Anforderungen erfüllen, gleichzeitig aber die Menge an Variationen in der Organisation auf einem handhabbaren Niveau zu halten.
Konfigurationsdrift
Beim Konfigurationsdrift handelt es sich um eine Variation, die mit der Zeit zwischen Systemen auftritt, die ursprünglich identisch waren. In Abbildung 2-1 ist das zu sehen. Der Drift kann durch manuelle Änderungen entstehen oder wenn Sie Automations-Tools nutzen, um kurzfristig Änderungen an nur ein paar der Instanzen vorzunehmen. Ein Konfigurationsdrift erschwert das konsistente Warten der Automation.
Abbildung 2-1: Bei einem Konfigurationsdrift kommt es bei Instanzen des gleichen Elements mit der Zeit zu Unterschieden.
Schauen Sie sich als Beispiel dafür, wie die Infrastruktur mit der Zeit auseinanderdriften kann, die Reise unseres Beispielteams bei ShopSpinner an.¹
ShopSpinner betreibt für jeden Store eine eigene Instanz ihrer Anwendung, und jede Instanz ist so konfiguriert, dass sie ein spezifisches Branding und einen eigenen Produktkatalog enthält. Früher ließ das ShopSpinner-Team Skripte laufen, um einen neuen Anwendungsserver für jeden neuen Store zu erstellen. Das Team betreute die Infrastruktur manuell oder durch das Schreiben von Skripten, die angepasst wurden, wenn eine Änderung erforderlich war.
Bei einem der Kunden – Water Works¹ – gibt es viel mehr Traffic in der Auftragsverwaltungs-Anwendung als bei den anderen, daher hat das Team die Konfiguration für den Server von Water Works angepasst. Es hat diese Änderungen aber nicht bei den anderen Kunden vorgenommen, weil es zu beschäftigt war und ihm dies auch nicht notwendig erschien.
Später wollte das ShopSpinner-Team Servermaker einsetzen, um die Konfiguration seiner Anwendungsserver zu automatisieren.² Es hat das Produkt zunächst mit dem Server für Palace Pens³ ausprobiert, weil bei diesem Kunden immer nur wenig Last vorherrscht, und es dann für die anderen Kunden ausgerollt. Leider hat der Code nicht die Performance-Optimierungen für Water Works enthalten, daher gingen diese Verbesserungen wieder verloren. Der Server von Water Works wurde immer langsamer, bis dem Team der Fehler auffiel und es ihn beseitigte.
Das ShopSpinner-Team hat darauf reagiert, indem es den Servermaker-Code parametrisiert hat. Es kann jetzt die Ressourcen-Level für jeden Kunden anders setzen. So ist es dazu in der Lage, bei jedem Kunden den gleichen Code anzuwenden, ihn aber trotzdem überall zu optimieren. In Kapitel 7 sind ein paar Patterns und Antipatterns für das Parametrisieren von Infrastruktur-Code für unterschiedliche Instanzen beschrieben.
Die Angstspirale der Automation
Die Angstspirale der Automation beschreibt, wie viele Teams dem Konfigurationsdrift und technischen Schulden anheimfallen.
In einer Open-Space-Session zur Konfigurationsautomation (https://oreil.ly/lXaFs) auf einer DevOpsDays-Konferenz (https://oreil.ly/x8G0C) habe ich die Gruppe gefragt, wie viele von ihnen Automations-Tools wie Ansible, Chef oder Puppet verwenden. Viele Hände gingen hoch. Dann fragte ich, wie viele diese Tools unbeaufsichtigt und mit einem automatisierten Zeitplan laufen lassen – die meisten Hände gingen wieder herunter.
Viele haben das gleiche Problem, das ich in meiner ersten Zeit mit Automations-Werkzeugen hatte. Ich habe sie selektiv verwendet – um zum Beispiel neue Server einfacher aufzusetzen oder um eine spezifische Konfigurationsänderung durchzuführen. Ich veränderte die Konfiguration jedes Mal, wenn ich sie laufen ließ, um sie an die eine Aufgabe anzupassen, die ich zu erledigen hatte.
Ich hatte Angst, meinen Automations-Tools den Rücken zuzukehren, weil ich ihnen nicht vertraute.
Dieses Vertrauen fehlte mir, weil meine Server nicht konsistent waren.
Meine Server waren nicht konsistent, weil ich die Automation nicht häufig und nicht konsistent laufen ließ.
Das ist die Angstspirale der Automation (siehe Abbildung 2-2). Infrastruktur-Teams müssen sie aufbrechen, um die Automation erfolgreich einsetzen zu können. Der effektivste Weg dazu ist, sich den eigenen Ängsten zu stellen. Beginnen Sie mit einem Satz von Servern. Stellen Sie sicher, dass Sie Ihren Infrastruktur-Code auf diese Server anwenden können – auch wiederholt. Dann schedulen Sie einen stündlichen Prozess, der den Code kontinuierlich auf diese Server anwendet. Dann wählen Sie einen anderen Satz Server und wiederholen den Prozess. Tun Sie das, bis jeder Server kontinuierlich aktualisiert wird.
Gutes Monitoring und automatisierte Tests sorgen für das Vertrauen, Ihren Code kontinuierlich zu synchronisieren. Das macht einen Konfigurationsdrift sofort offensichtlich, sodass Sie sie direkt beheben können.
Abbildung 2-2: Die Angstspirale der Automation
Prinzip: Stellen Sie sicher, dass Sie jeden Prozess wiederholen können
Aufbauend auf dem Prinzip der Reproduzierbarkeit sollten Sie dazu in der Lage sein, alles zu wiederholen, was Sie mit Ihrer Infrastruktur anstellen. Es ist einfacher, Aktionen durch Skripte und Werkzeuge zum Konfigurationsmanagement zu wiederholen, als dies von Hand umzusetzen. Aber Automation kann viel Arbeit bedeuten, insbesondere, wenn Sie nicht damit vertraut sind.
Nehmen wir beispielsweise an, dass ich als einmalige Aufgabe eine Festplatte partitionieren muss. Das Schreiben und Testen eines Skripts ist oft viel mehr Arbeit, als sich einfach anzumelden und den Befehl fdisk laufen zu lassen. Also mache ich es per Hand.
Es wird