Code your Infrastructure - Terraform

Vom 13. Januar 2020. Gerhard Hipfinger, Gründer und Geschäftsführer

#cloud #devops

Es ist kurz nach 3 Uhr morgens. Der Bereitschaftsdienst habende Kollege aus der IT bekommt eine SMS vom Monitoring System. Ein wichtiges Service ist ausgefallen. Trotz der späten Stunde könnten Kunden davon betroffen sein. Oh, ein Kunden ist jedenfalls betroffen, denn in Kürze beginnt der automatische Datenabgleich mit einem wichtigen Partner.

Jetzt muss es schnell gehen. Der Kollege schleppt sich zum Laptop und verschafft sich einen Überblick. Die ersten Tests zeigen, es handelt sich nicht um einen Fehlalarm. Der Dienst ist tatsächlich nicht erreichbar. Doch wo genau liegt das Problem? Nach weiteren Untersuchungen stellt sich heraus, dass ein Server im Rechenzentrum offenbar seinen Geist aufgegeben hat und nicht mehr erreichbar ist. Das klingt nach einer Menge Arbeit. Natürlich gibt es Backups die hinterlegt sind, aber dennoch muss ein neuer Server eingerichtet und provisioniert werden. Das Einspielen des Backups dauert auch eine gewisse Zeit. Also an die Arbeit, die Nachtruhe ist vorbei und der Stresspegel steigt von Minute zu Minute.

Das ist in vielen Unternehmen ein immer noch typisches Szenario. Insbesondere, wenn man die Infrastruktur mit eigener Hardware betreibt. Ist die eigene Infrastruktur über Schnittstellen steuerbar oder hat man überhaupt bereits alle Infrastruktur Systeme in die Cloud verlegt treibt einen obiges Szenario keine Schweißperlen mehr auf die Stirn - oder zumindest weniger. Ein neuer Server ist rasch aufgesetzt und provisioniert. Auch das Einspielen von Backups oder Snapshots muss in diesem Fall automatisiert durchgeführt werden können.

Für das Steuern von Server Instanzen verwenden wir das Tool Terraform. Mit Terraform lassen sich virtualisierte Umgebungen sowohl in der Cloud als auch im eigenen Rechenzentrum steuern. Bei openFORCE verwenden wir einen europäischen Cloud Provider mit Rechenzentren in Deutschland und Finnland - Hetzner. Eine der für uns wichtigsten Gründe sich für Hetzner zu entscheiden (neben DSGVO konformen Betrieb, Daten in Europa und natürlich guter Verfügbarkeit und Performance) war, dass Hetzner eine Schnittstelle zur Steuerung der IT Infrastruktur zur Verfügung stellt und Terraform diese Schnittstelle unterstützt.

Um einen Eindruck zu vermitteln wie mit Terraform die Infrastruktur gesteuert wird, bietet sich ein einfaches Beispiel an:

# Create a new server running Debian
resource "hcloud_server" "web_01" {
  name = "web-01"
  image = "debian-10"
  server_type = "cx21"
}

Mit diesem einfachen Script (in der Praxis braucht es noch etwas mehr, so muss natürlich der Zugang mit dem eigenen SSH Schlüssel entsprechend konfiguriert werden) wird durch den Befehl

terraform apply

der ausgewählte Server aufgesetzt und gestartet. Will man diesem Server noch zusätzlichen “Festplattenspeicher” zukommen lassen, ergänzt man obiges Script um die folgenden Zeilen:

resource "hcloud_volume" "image-storage" {
  name = "vol_storage"
  size = 50
  server_id = "${hcloud_server.web_01.id}"
  automount = true
}

Führt man danach noch einmal

terraform apply

aus, so wird ein neues Storage Volume erzeugt und mit dem Server verbunden. Terraform aktualisert nach jedem terraform apply den Status der Infrastruktur und speichert diesen (im einfachsten Fall) lokal ab. So kann Terraform feststellen, welche Änderungen seit dem letzten Aufruf durchgeführt wurden und aktualisiert nur die entsprechend notwendigen Ressourcen (wie eben Server, Storage, IP Adressen und alles was der Infrastruktur Provider unterstützt).

Konfiguriert man seine Infrastruktur vollständig mit Terraform, und das sollte man tun, dann hat man jederzeit einen Überblick über die gesamte laufende Infrastruktur. Man kann die Konfiguration ändern und Terraform leitet aus dem letzten bekannten Zustand, sowie den Änderungen in der Konfiguration, alle notwendigen Installationsprozesse ab, die beim nächsten terraform apply durchgeführt werden müssen. Dazu wieder ein Beispiel.

Unsere Webseite ist so erfolgreich, dass unser oben definierter Webserver alleine mit der Auslieferung der Webseiten an unsere Besucher überlastet ist. Wir brauchen also dringend einen weiteren Webserver. Dazu ändern wir unser obiges Script nur minimal!

# Create a new server running Debian
resource "hcloud_server" "web" {
  count = 3
  name = "web-${count.index}"
  image = "debian-10"
  server_type = "cx21"
}

Durch die Anweisung count = 3 werden einfach insgesamt drei Server Instanzen gestartet und die Änderung beim Namen führt dazu, dass unsere drei neuen Server die Namen “web-0”, “web-1” sowie “web-2” haben. Führt man nach dieser Änderung ein weiteres mal

terraform apply

aus, so weiss Terraform, dass bereits ein Server existiert und nur noch zwei weitere erstellt werden müssen! Leider funktioniert das nicht genau so, wir müssen noch die Konfiguration unseres Storage Volumes ändern, denn es gibt ja jetzt drei Server. Also ändern wir auch noch die folgenden Teile unserer Konfiguration:

resource "hcloud_volume" "image-storage" {
  location = "nbg1"
  size     = 50
}

resource "hcloud_volume_attachment" "main" {
  count = 3
  volume_id = "${hcloud_volume.image-storage[count.index].id}"
  server_id = "${hcloud_server.web[count.index].id}"
  automount = true
}

Wir erstellen nun ein Storage Volume und verbinden es mit allen drei Webservern. Und spätestens hier lässt sich die Mächtigkeit des Tools erahnen!

Nach der erfolgreichen Kampagne wird unsere Website abgeschaltet und wir brauchen unsere 3 Webserver nicht mehr.

terraform destroy

dient dazu, die konfigurierten Ressourcen zu löschen. In unserem Fall wird alles aufgeräumt, die drei Server sowie unser Storage Volume.

Dieser Beitrag kann nur an der Oberfläche kratzen. Die Möglichkeiten des Tools sind enorm vielfältig. Wir verwenden Terraform sehr erfolgreich um unsere gesamte Infrastruktur zu administrieren. Alle unsere Web Server, Entwicklungssysteme, Produktivsysteme werden mittels Terraform verwaltet. Auch dieser Beitrag wird von einem Server geliefert, der mittels Terraform aufgesetzt wurde ;-)

Um auf unser einleitendes Beispiel zu kommen. Terraform hat zwar die Server gestartet, aber sonst ist noch nichts passiert. Es ist keine zusätliche Software installiert worden, kein Backup eingespielt. Macht aber nichts, Rom ist auch nicht an einem Tag erbaut worden und schließlich brauche ich ja noch Stoff für die nächsten Beiträge!

Gerhard Hipfinger
Gerhard Hipfinger
Gründer und Geschäftsführer

Gerhard ist Softwarearchitekt mit einem starken Infrastruktur Background und Unternehmer. Im Jahr 2002 gründete er gemeinsam mit Otto Meinhart die openFORCE Information Technology um Software Teams und Kunden mit der richtigen Softwarearchitektur und einem ausgeklügelten Entwicklungsprozess zu unterstützen. Gemeinsam mit Otto treibt er strategische Themen, um die openFORCE auf die zukünftigen Herausforderungen der Märkte vorzubereiten und die Rahmenbedingungen für eine selbstorganisierte und transparente Organisation zu schaffen.

LinkedIn Xing