Mit Infrastructure as Code dein Deployment automatisieren

Macht die Cloud Infrastructure as Code notwendig?

Viele Unternehmen setzen auf die Vorteile der Cloud

Heute setzen immer mehr Unternehmen auf die Vorteile von Cloud-Infrastrukturen wie IaaS und PaaS, die es erlauben, Server in beliebiger Ausführung in nur wenigen Minuten bereitzustellen.

Mussten Server früher bei Bedarf bestellt, geliefert und aufwendig konfiguriert werden, sind sie heutzutage mit ein paar Klicks einsatzbereit. Daneben ermöglichen Cloud Services stets an den Bedarf angepasste Infrastrukturen, die bei steigendem Zugriff Engpässe verhindern. Durch das sogenannte Autoscaling vermeiden Unternehmen unnötige Kosten, die bei der herkömmlichen Bereitstellung von Servern durch nicht benötigte Kapazitäten entstehen würden.

Die Nutzung von Cloud Computing bietet darüber hinaus weitere innovative Features und Vorteile, welche die Verwendung dieser Services in vielen Bereichen zum Standard machen.

Auswirkungen der schnellen Verfügbarkeit von Ressourcen

Bei allen Vorteilen der Cloud sehen sich Anwender irgendwann mit einer größeren Anzahl an zu managenden Servern konfrontiert, begünstigt durch die einfache und schnelle Bereitstellung. Setzt man in der Softwareentwicklung zudem auf Microservices, wird es um einiges schwieriger, den Überblick über alle Komponenten zu behalten und diese vernünftig zu verwalten.

Dank IaaS und Managed Kubernetes kann jeder Service auf einem separaten, passgenauen Server oder Container laufen. Damit wird die Trennung großer Softwaremonolithen in kleine, getrennt entwickelbare Services ermöglicht – jedoch auf Kosten einer komplexeren Infrastruktur. Die Folgen sind erhöhter Arbeitsaufwand oder im schlimmsten Fall Systemausfälle.

Um die Herausforderungen zu bewältigen, die moderne IT-Prozesse an die Infrastruktur stellen, und trotzdem nicht auf die Vorteile der Cloud zu verzichten, ist Infrastructure as Code entstanden. Mit Infrastructure as Code lässt sich Infrastruktur automatisiert und unkompliziert ausrollen und handhaben. Das macht das Management deiner Infrastruktur schneller, skalierbarer und es minimiert das Risiko von Fehlern beim Deployment. Wir zeigen dir hier, wie das geht.

Was ist Infrastructure as Code?

IaC ist also eine Methode, mit der die Bereitstellung von Infrastruktur wie CPU, Speicher und Netzwerk mithilfe von Code ermöglicht wird.

Wie oben beschrieben, ist die Bereitstellung neuer Serverkapazitäten durch Cloud Computing leicht geworden. Gewöhnlich startest du einen neuen Server per Hand, z. B. über unser Webinterface oder unsere CLI. Du triffst Entscheidungen, unter anderem wie viele CPUs , welches Betriebssystem sowie die Größe des Storages. Optionen, die bei manuellen Wiederholungen nicht leicht zu merken sind und die so eine potenzielle Fehlerquelle darstellen.

Ein IaC-Tool hilft dir, diesen Prozess zu vereinfachen, indem du deine Entscheidungen in einem Template speicherst. Dieses Template kannst du jederzeit aufrufen, wenn du einen bestimmten Server benötigst. So kann für jeden Anwendungsfall eine passende Vorlage erstellt und verwendet werden. Damit lässt sich der Aufbau deiner Infrastruktur automatisieren. Du profitierst von zahlreichen Vorteilen, die deine IT-Prozesse verbessern.

Diese erörtern wir im folgenden Kapitel, bevor wir anschließend die Funktionsweisen und nötigen Schritte betrachten, mit denen du deine IT-Infrastruktur besser machst.

Infrastructure as Code die Praxis, Serverkonfigurationen und Netzwerkeinstellungen in einem textbasierten Format zu beschreiben, um das Provisioning/Deployment von Servern zu vereinfachen.

Kief Morris

Die Vorteile von ‚Infrastructure as Code‘

Infrastruktur wie Programmcode behandeln

Das IaC-Konzept ermöglicht es, bewährte Methoden aus der Softwareentwicklung auf das Management von IT-Infrastrukturen zu übertragen. Werden Leistungen wie CPU, Speicher und Netzwerk in einem textbasierten und maschinenlesbaren Format festgehalten, bringt das neben der Möglichkeit zur Automatisierung weitere Vorteile, von denen auch Softwareentwickler seit vielen Jahren profitieren. Allen voran die Versionskontrolle mit einem System wie git

Mit IaC Teamarbeit verbessern

Die in einem Template beschriebene Infrastruktur lässt sich als Datei im Repository eines VCS (Version Control System) abspeichern. Wie Programmcode werden die Konfigurationen dadurch teilbar und lassen sich von verschiedenen Personen bearbeiten und kontrollieren. So werden sowohl die Verwaltung deiner Infrastruktur, als auch die Arbeit zwischen verschiedenen Teams erheblich erleichtert. Basierend auf dem aktuellen Template lassen sich von jedem Team und jedem einzelnen Mitglied neue Varianten der Serverkonfiguration erstellen und ausprobieren, testen und verbessern.

Änderungen werden nachvollziehbar und umkehrbar

Sei es ein Update einer Programmbibliothek, ein Patch oder einfach nur ein neues Benutzerkonto, gelegentlich muss ein Server aktualisiert werden. Bisher führte man solche Änderungen oft über SSH am Server durch. Das geht schnell, doch die durchgeführten Änderungen sind nirgendwo dokumentiert und später kaum mehr nachvollziehbar. Bei komplexeren Infrastrukturen kommt es damit fast zwangsläufig zum Problem nicht mehr identischer Systeme, bekannt als Konfigurationsdrift oder Snowflake-Server. In der Folge sind die Systeme schwerer zu warten und anfälliger für Fehler.

Mit IaC wird ausschließlich die Konfigurationsdatei geändert. Ein auf dem Server installierter Agent oder ein Tool wie Terraform starten in regelmäßigen Abständen und setzen die Änderungen um. So werden Inkonsistenzen zwischen Servern auf ein Minimum reduziert oder vermieden.

Da die Konfiguration zudem in einem VCS gespeichert ist, lassen sich Modifikationen leicht nachvollziehen und können, wenn Probleme auftreten, schnell auf den letzten funktionierenden Stand zurückgesetzt werden

Infrastructure as Code als Dokumentation

Wie erwähnt, werden IT-Prozesse oft gar nicht oder nur unzureichend dokumentiert, sodass sie im Nachhinein für Kollegen oder einen selbst nur noch schwer zu verstehen sind. IaC-Tools beugen dem Problem der unzureichenden Dokumentation vor, indem sie dem sogenannten deklarativen Programmierparadigma entsprechen und damit selbstdokumentierend sind.

Im Gegensatz zu prozeduralen oder imperativen Sprachen, die beschreiben, auf welchem Weg man zu einem Ziel kommt, definiert man in einer deklarativenSprache, wie ein Ergebnis am Ende aussehen soll. Zudem sind diese Sprachen leicht zu lesen, weswegen man so gut wie keine zusätzliche Dokumentation benötigt.

Da deklarative Sprachen ein Ziel beschreiben, sind sie darüber hinaus idempotent. Das bedeutet, egal wie oft man eine bestehende Konfiguration anwendet, das Ergebnis einer Ausführung ist immer dasselbe. Das ist eine wichtige und nicht zu unterschätzende Eigenschaft deklarativer Sprachen, die sie für IaC so geeignet macht. Damit wird beispielsweise verhindert, dass bei jedem Aufruf der Konfigurationsdatei ein bereits vorhandener User oder Server erneut erstellt wird und am Ende mehrmals vorliegt.

Testumgebung als Kopie der Produktionsumgebung

Auch Prozesse in der Softwareentwicklung lassen sich mit IaC verbessern. Liegt die Infrastruktur als Template in einem Repository, lassen sich damit bessere Entwicklungspipelines bauen. Für eine Staging-Umgebung nutzt man einfach das Template des Produktionsservers, wodurch man identische Ressourcen bereitstellen kann. Tests gewinnen an Aussagekraft und Fehler fallen nicht erst auf, wenn das neue Feature schon live ist.

Infrastruktur wird besser testbar

Mit IaC lassen sich nicht nur Entwicklungspipelines verbessern, sondern auch die Infrastruktur testen. Mit Test Kitchen oder Serverspec kannst du Tests für deine Infrastruktur-Konfigurationen schreiben, die dann wie Code in einer CI/CD-Pipeline automatisiert überprüft werden. Jede Änderung stößt die Pipeline an und du siehst direkt, ob irgendwas nicht stimmt. So gehärtete Infrastruktur wird in der Produktion viel verlässlicher sein als ungetestete Ressourcen.

Infrastructure as Code – Funktionsweise und Tools im Überblick

Infrastructure Definition Tools & Server Konfigurationstools

Wie bringe ich IaC in mein Unternehmen? Das ist eigentlich gar nicht so schwer. Für die konkrete Umsetzung von IaC benötigt man ein IaC-Tool, von denen es inzwischen einige gibt. Nachdem wir kurz die Unterschiede der einzelnen Tools betrachten, werden wir im Anschluss noch auf zwei unserer Meinung nach besonders empfehlenswerte Umsetzungen eingehen. 

In der Regel unterscheidet man bei der Provisionierung die Bereitstellung der Infrastruktur von der Konfiguration der einzelnen Bestandteile. Die verschiedenen IaC-Tools decken dabei nicht immer alle Bereiche des Infrastruktur-Managements ab. Einige bauen aufeinander auf und ergänzen sich, andere wiederum überschneiden sich in ihren Funktionen teilweise stark. Manche Lösungen sind auf einen Bereich spezialisiert, während ältere Anwendungen oft versuchen, den kompletten Prozess abzubilden. 

IaC-Tools werden also in zwei Bereiche unterteilt:

Infrastruktur-Definitions-Tools sind für die Initialisierung und das Grundgerüst zuständig. Es wird festgelegt, welche Server wie provisioniert werden und wie sie miteinander in Verbindung stehen. So lassen sich komplexe Serverlandschaften aufbauen, überwachen und verwalten.

Sind die Server bereitgestellt, kann man diese mithilfe von Konfigurationsmanagement-Tools anpassen. Mit diesen lassen sich Änderungen vornehmen, Updates einspielen oder neue Software installieren. Die bekanntesten Konfigurations- und Definitionstools sind Puppet, Chef, Jenkins, Ansible und Terraform. Terraform wollen wir im Folgenden genauer vorstellen, da es alle oben genannten Vorteile vereint und immer populärer wird.

Terraform

Infrastruktur-Definition und Templates

Obwohl Terraform im Vergleich zu anderen Tools erst seit 2014 existiert, hat es schnell an Beliebtheit gewonnen und gilt mittlerweile als De-facto-Standard für Infrastruktur-Definitionen. Es ermöglicht dem Nutzer, eine Infrastruktur mittels Templates aufzubauen, zu ändern und durch Versionierung sicher und effizient zu verwalten und weiterzuentwickeln. 

Terraform ist Open Source, geschrieben in Go und beschreibt eine IT-Infrastruktur in Konfigurationsdateien in einer eigens entwickelten anwendungsspezifischen Sprache, der Hashicorp Configuration Language.

Terraform vereinheitlicht das Provisioning über verschiedene Anbieter hinweg

Der große Vorteil von Terraform ist, dass es cloud-agnostic ist. Das heißt, es basiert nicht auf einem bestimmten Anbieter. Für dein Unternehmen bedeutet das, dass Terraform auch bei einem Wechsel des Cloud-Anbieters oder bei einem Übergang zu einem Hybrid Cloud-Modell weiter genutzt werden kann. Du gerätst nicht in einen Vendor-Lock-In und bleibst bei der Wahl des Cloud Providers flexibel. Gewisse Anpassungen sind nötig, aber ein neues Tool oder eine neue Sprache müssen nicht gelernt werden.

Einzelne Anbieter werden als Plugins bereitgestellt und sind in der Terraform Registry zu finden. Damit vereinheitlicht Terraform die Konfiguration über verschiedene Cloud Provider hinweg und ermöglicht die einfache Umsetzung von Multi Cloud-Setups.

Abhängigkeiten und Komponenten festlegen

In der nebenstehenden Abbildung siehst du das Beispiel einer Konfigurationsdatei. In einer Konfiguration lassen sich nicht nur die einzelnen Komponenten der Infrastruktur bestimmen, sondern auch Reihenfolgen und Abhängigkeiten der einzelnen Bestandteile. So kann beispielsweise definiert werden, dass zunächst ein Datenbankserver erstellt werden soll und erst im Anschluss die verbundenen Webserver. Damit vermeidet man Fehlermeldungen, die ein Webserver ohne Datenbank ausgeben würde.

Ausführungsplan setzt Konfiguration um

Nachdem die Infrastruktur in einer Konfigurationsdatei beschrieben wurde, generiert Terraform einen Ausführungsplan, indem beschrieben ist, wie die gewünschte Konfiguration erreicht werden kann. Der Ausführungsplan dient der Absicherung, da hier genau aufgeführt wird, welche Komponenten provisioniert, verändert oder gelöscht werden. Erst wenn man diesen Plan bestätigt, führt Terraform alle notwendigen Schritte aus und baut die Infrastruktur dem Plan entsprechend auf.

Bei jeder Ausführung erstellt Terraform eine .tfstate-Datei, die den neuen Status Quo der bereitgestellten Infrastruktur speichert. Diese Datei dient dem Abgleich mit einer geänderten Konfiguration, sodass nicht die komplette Infrastruktur jedesmal komplett neu aufgebaut wird, sondern nur die Modifikationen umgesetzt werden. 

Terraform ist schnell

Da Terraform die Erstellung und Modifizierung von nicht-abhängigen Ressourcen gleichzeitig durchführen kann, erfolgt die Bereitstellung der Infrastruktur sehr schnell.

Vorteile gegenüber anderen Infrastructure-Definition-Tools

Der Vollständigkeit halber sollen auch die Mitbewerber kurz erwähnt werden und warum Terraform Vorteile bietet:

  • Heat und Cloud Formation: Auch in diesen Tools schreibt man Konfigurationsdateien. Terraform ist aber im Gegensatz zu diesen Tools „cloud-agnostic“, also nicht spezifisch auf einen Provider oder Service beschränkt.
  • Boto und Fog: Boto und Fog sind Bibliotheken, die den Zugriff auf die API bestimmter Cloud-Anbieter gewähren. Dieser ist aber eher dafür gedacht, um eigene Anwendungen mit Zugriff auf den entsprechenden Anbieter zu entwickeln.

Anwenderfreundlicher Einstieg in Infrastructure as Code

Insgesamt betrachtet bietet Terraform einen guten und leichten Einstieg in die Definition von Infrastruktur. Der große Vorteil liegt in der anwenderfreundlichen Programmstruktur und in Hinblick auf Wahlfreiheit darin, dass es cloud-agnostic ist.

Server Konfigurationstools

Hat man seine Infrastruktur mithilfe von Terraform aufgesetzt, werden einzelne Programme und Bestandteile der Server mit einem Server-Konfigurationstool eingerichtet und verwaltet. Die Konfigurationstools sind dafür verantwortlich, Änderungen an den Servern durchzuführen und diese nach Möglichkeit synchron zu halten.

Server Change Management

Will man Änderungen an einem Server durchführen, gibt es unterschiedliche Wege das zu tun. Folgende Modelle werden unterschieden: 

  • Ad Hoc
  • Configuration Synchronization
  • Immutable Server
  • Containerized Servers.

IaC-Tools setzen auf die Configuration Synchronization. Die Konfigurationsdatei wird periodisch auf den Servern ausgeführt, z. B. jede Stunde. So gewährleistet man, dass Änderungen auf allen Servern gleichermaßen umgesetzt werden und außerdem reproduzierbar sind.
Die bekanntesten Server-Konfigurationstools sind:

  • CFEngine
  • Puppet
  • Chef
  • Ansible
  • Saltstack

Ansible

Was Terraform für die Infrastruktur-Definition ist, ist Ansible für die Server-Konfiguration – weswegen wir einen genaueren Blick auf das Tool werfen. Noch sind zwar sind Chef und Puppet die Standardtools für Server-Konfiguration-Management, doch Ansible erfreut sich immer größerer Beliebtheit. Ansible existiert seit 2012 und ist wie Terraform Open Source, im Gegensatz zu diesem aber in Python geschrieben.

Push vs. Pull-Modell

Der Hauptunterschied zwischen Puppet und Chef auf der einen und Ansible auf der anderen Seite ist, wie die Programme Änderungen auf den Server übertragen: 

  • Chef und Puppet nutzen das Pull-Modell: Dazu muss auf jedem gemanagten Server ein Agent installiert und konfiguriert werden, der periodisch die neuesten Definitionen lädt.
  • Ansible pusht Änderungen mittels SSH von einem zentralen Server auf die entsprechenden Ressourcen. Das ist bequemer, kann aber unter gewissen Umständen leichter von Angreifern als potentielle Sicherheitslücke attackiert werden. Hier muss man für entsprechende Sicherheitsvorkehrungen sorgen, die auch beim Pull-Modell nicht außer Acht gelassen werden sollten.

Module für fast jeden Use Case

Die Hauptkomponenten in Ansible bilden die Module. Es gibt über 2000 für beinahe jeden Anwendungsfall. Sie können in jeder beliebigen Programmiersprache geschrieben sein.

  • Inventory File
    Welche Hosts orchestriert werden sollen, legt man in einem sogenannten Inventory-File fest. Hier lassen sich auch Gruppen anlegen, um Server kollektiv anzusprechen. 
    Ansible lässt sich dann für Ad-Hoc Kommandos über das Terminal nutzen, z. B. um den Status der Infrastruktur in Erfahrung zu bringen.
  • Das Playbook
    Will man mehrere Befehle entsprechend des Infrastructure-as-Code-Gedankens kombinieren und in abrufbaren Dateien speichern, können die Module als Tasks in einem Playbook zusammengefasst werden, das im YAML-Format geschrieben ist. Den einzelnen Modulen sind dabei Hosts oder Hostgruppen aus der Inventory File zugeordnet.
    Die Module können z. B. einen nginx-Server installieren oder systemd ansprechen. Dazu gibt man meist einen Namen an, der den Task beschreibt, dann eine Rechtezuweisung und den Paket-Namen. Häufig können noch weitere Parameter angegeben werden, wie Status, Bedingungen, oder Quell- und Zielpfade. Das Playbook startet man mit dem Befehl »ansible-playbook«.
  • Nutzen von Variablen
    Auch die Nutzung von Variablen ist möglich. Diese helfen, bestimmte Einstellungen zentral abzuspeichern, um sie dann in verschiedenen Playbooks verwenden zu können, beispielsweise um immer die aktuellste Version eines Programms zu laden oder einen bestimmten Pfad zu speichern. Ansible nutzt dabei die aus Python bekannte Jinja-Syntax (zwei geschweifte Klammern: {{ }} ). 
    Einige Variablen liefert Ansible von Haus aus mit. Bei jedem Start eines Playbooks sammelt Ansible ein paar Details über den Server ein, die dann für die weitere Nutzung zur Verfügung stehen.
  • Aufgaben in Module fassen
    Darüber hinaus lassen sich in Playbooks Rollen definieren, um verschiedene Aufgaben zu Modulen zusammenfassen, die sich auf verschiedene Servergruppen anwenden lassen.

Leicht und umfangreich

Insgesamt ist Ansible leicht zu lernen. Es ist wie Terraform ein guter Einstieg in Infrastructure as Code. Die umfangreiche Modulbibliothek bildet viele Anwendungsfälle ab, sodass sich Einstellungen schnell konfigurieren lassen.

Infrastructure as Code lohnt sich trotz Einstiegshürden

Damit haben wir sowohl Infrastructure as Code im Allgemeinen betrachtet, als auch die Funktionsweise einzelner Tools beschrieben. Mit diesem Vorwissen solltet ihr entscheiden können, ob ihr IaC ausprobieren möchtet und ob die Vorteile euer Unternehmen weiterbringen.

Grundsätzlich lässt sich sagen, je höher die Zahl der zu verwaltenden Services, desto sinnvoller wird die Verwaltung der Infrastruktur mit IaC.

In der Serververwaltung erfreut sich IaC aufgrund komplexer werdenden Infrastrukturen immer größerer Beliebtheit. Zwar erfordert die Einarbeitung etwas Zeit und das Lernen neuer Tools und Sprachen ist auf den ersten Blick aufwendig – hat man diese Einstiegshürden aber gemeistert, überwiegen die Vorteile. So können IT-Prozesse automatisiert werden, wodurch die Verwaltung der Infrastruktur einfacher, schneller, sicherer und weniger fehleranfällig wird. Weniger Fehler und Systemausfälle sparen am Ende einiges an Zeit und Kosten, die für sinnvollere Projekte genutzt werden können. Die Teilbarkeit der Templates stärkt und vereinfacht die Zusammenarbeit über verschiedene Teams hinweg. Die wichtige Dokumentation, um Prozesse schnell nachzuvollziehen, wird mit IaC stets mitgeliefert.

Auch in der Softwareentwicklung können Prozesse und Workflows verbessert werden. Verlässlichere und schneller aufgesetzte Entwicklungspipelines beschleunigen die Entwicklung. Im Hinblick auf moderne Softwarekonzepte wie Microservices, bei denen jeder Service auf einem eigenen Server läuft, ist effizientes Infrastruktur-Management ohne IaC kaum noch umsetzbar