←→ Abschnitte wechseln
Einführung · Infrastructure as Code

IaC – Infrastructure as Code mit Terraform

Was IaC ist, welche Werkzeuge es gibt und wie Terraform funktioniert. Mit Beispielen auf Azure.

~/iac-demo
$ terraform apply -var-file=dev.tfvars

  + azurerm_resource_group.rg
  + azurerm_service_plan.plan
  + azurerm_linux_web_app.app

Plan: 4 to add, 0 to change, 0 to destroy.

Apply complete! Resources: 4 added.
01Ausgangslage

Wie entsteht heute eine neue App-Umgebung?

  1. Tag 1

    Ticket

    «Wir brauchen eine Web App.»

  2. Tag 1

    Klicken

    Portal, Wizard, Werte aus dem Kopf.

  3. Tag 3

    Nachbessern

    TLS vergessen, falscher Tarif.

  4. Woche 2

    Nochmals

    Dasselbe für test und prod.

Fazit

Die Konfiguration ist nirgends zentral festgehalten.

02Ausgangslage

Das Problem: Umgebungen laufen auseinander

Einstellungdevtestprod
RegionSwitzerland NorthSwitzerland NorthWest Europe
LaufzeitNode 22 LTSNode 18 LTSNode 22 LTS
Nur HTTPSEinEinAus
Mindest-TLS1.21.01.2
Fazit

Von Hand gebaute Umgebungen laufen auseinander. Mit IaC kommen alle aus derselben Vorlage.

03Die Idee

Was ist Infrastructure as Code?

Wir beschreiben die gewünschte Infrastruktur in Textdateien, legen sie ins Git und lassen ein Werkzeug die Realität daran angleichen.

So läuft eine Änderung mit IaC ab

  1. 1Code schreibenÄnderung in einer .tf-Datei, z.B. eine neue Datenbank
  2. 2ReviewPull Request im Git. Kollegen prüfen den Code und die Vorschau (plan)
  3. 3AusführenNach Freigabe setzt die Pipeline die Änderung um (apply)
  4. 4ErgebnisAzure entspricht dem Code. Der Git-Verlauf zeigt wer, was, wann
Ohne IaC (Portal)Mit IaC
Wo steht die Konfiguration?Im Portal und im Kopf einzelner PersonenIn Textdateien im Git
Wie wird geändert?Klicken, sofort livePull Request, Review, dann Pipeline
Wer hat was geändert?Activity Log, ohne BegründungGit-Verlauf mit Autor und Kommentar
Neue Umgebung aufbauenAlle Schritte erneut von HandGleicher Code, andere Werte
Fazit

Die Infrastruktur ist im Code beschrieben und damit wiederholbar, versioniert und automatisiert.

04Die Idee

Deklarativ vs. imperativ

Beim ersten Aufbau sehen beide ähnlich aus. Der echte Unterschied zeigt sich bei Updates.

Deklarativ = definiere WAS du am Ende willst

Man beschreibt, was man will. Das System findet selbst heraus, wie.


        

Beispiele: Terraform, OpenTofu, Pulumi, Bicep, ARM Templates

Imperativ = definiere die genauen Schritte, WIE

Man gibt Schritt für Schritt vor, wie man zum Ergebnis kommt.


        

Beispiele: Bash- oder PowerShell-Skripte mit Azure CLI, Python mit Azure SDK

Fazit

Deklarativ: Zielzustand anpassen, Terraform rechnet die Differenz aus. Imperativ: Man muss jede Änderung selbst als Schritt formulieren.

05Die Idee

Vorteile: reproduzierbar und wiederverwendbar

Ein Bauplan mit Platzhaltern, beliebig viele Umgebungen. Die Werte kommen aus einer kleinen Datei pro Umgebung.


      
✓
Ergebnis für devso baut Terraform die Umgebung

      

Pro Umgebung nur eine kleine .tfvars-Datei mit den Werten. Klicken Sie auf eine Umgebung.

  • Reproduzierbardev = test = prod
  • WiederverwendbarModule für alle Teams
  • PrüfbarReview per Pull Request
  • WiederherstellbarNach Ausfall neu aufbauen
06Werkzeuge

Welche IaC-Werkzeuge gibt es?

WerkzeugSpracheCloudsLizenzKosten
TerraformHCLalleBSL 1.1CLI gratis · Plattform kostenpflichtig (siehe unten)
OpenTofuHCLalleOpen Sourcegratis
PulumiPython, TypeScript, Go, C#alleOpen SourceCLI gratis · Pulumi Cloud für Teams
BicepBicepnur AzureMITgratis
ARM TemplatesJSONnur AzureTeil von Azuregratis · Vorgänger von Bicep
Terraform CLI (Community Edition)gratis

Das Kommandozeilen-Tool. Interne Nutzung ohne Lizenz erlaubt.

Fazit

Die CLI ist gratis, die Plattform kostet. Für die BKB ist Terraform Enterprise vorgesehen: selbst betrieben, mit Rechten, Audit und Hersteller-Support.

07Werkzeuge

Was ist Terraform?

Terraform ist für das Erstellen und Pflegen von Infrastruktur da.Creating and maintaining infrastructure

Typischerweise läuft ein Projekt in zwei Schritten:

1Infrastruktur bereitstellen

VNet, VMs, App Service Plan, AKS, Key Vault, Zugriffsrechte

Dafür wird Terraform verwendet

2Anwendungen deployen

App-Code auf App Service oder AKS bringen

meist per Azure-DevOps-Pipeline
Fazit

Terraform wird für Schritt 1 verwendet: Es stellt die Infrastruktur bereit, auf der die Anwendungen danach laufen.

08Werkzeuge

Terraform und Ansible: Was ist der Unterschied?

Ansible ist für das Einrichten und Konfigurieren von Servern da.Configuring and managing servers

Gemeinsam: Beide sind Infrastructure as Code und automatisieren Bereitstellung, Konfiguration und Verwaltung von Infrastruktur.
Ansible

Hauptsächlich Konfiguration

  • Bestehende Infrastruktur konfigurieren
  • Apps deployen
  • Software installieren und aktualisieren
ausgereifter · seit 2012
Terraform

Hauptsächlich Provisionierung

  • Infrastruktur bereitstellen, z.B. VNet, VM, App Service
  • Kann auch Apps deployen
  • Stärker in der Orchestrierung: kennt Abhängigkeiten und baut in der richtigen Reihenfolge
  • Erkennt Abweichungen über den State
etwas jünger · seit 2014
Fazit

Oft kombiniert: Terraform erstellt die Azure VM, Ansible richtet sie ein. Für PaaS wie den App Service reicht Terraform allein.

09Werkzeuge

So sieht ein Terraform-Repo aus

Ein normaler Ordner im Git. Terraform liest alle .tf-Dateien darin zusammen, die Dateinamen sind nur Konvention. Klicken Sie auf eine Datei. Gelb = von Git ignoriert.

iac-demo⎇ main
Project
iac-demo › main.tfUTF-8 · 2 spaces · HCL
Fazit

.tf beschreibt die Infrastruktur, .tfvars liefert die Werte pro Umgebung. Der State liegt nicht im Repo.

10Werkzeuge

Wie funktioniert Terraform?

Zwei Hauptkomponenten: der Core und die Plugins (vor allem Provider). Dazu kommt das Gedächtnis: die State-Datei.

Entwickler / Pipeline
  1. 1Konfiguration schreiben
    *.tf = gewünschter Zustand
  2. 2Befehl starten
    plan oder apply
Terraform

3Core

vergleicht Konfiguration mit State und berechnet den Plan

Plugins

4Provider

setzen den Plan per API in Azure um

azurermazuread
Plugins

Provisioner

Skripte ausführen. Nur als Notlösung.

Gedächtnis

5State-Datei

terraform.tfstate · wird nach apply aktualisiert

Plattform

Azure

die echte Infrastruktur

Fazit

Der Core vergleicht Konfiguration mit State, die Provider setzen die Differenz in Azure um. Der State ist das Gedächtnis dazwischen.

11Werkzeuge

Die State-Datei: der aktuelle Stand

.tf
main.tfgewünschter Zustand · im Git
vergleicht
{ }
terraform.tfstateaktueller Zustand · im Remote Backend
terraform.tfstateeinfache JSON-Datei (gekürzt)
{  "version": 4,  "terraform_version": "1.15.8",  "serial": 7,  "resources": [    {      "mode": "managed",      "type": "azurerm_linux_web_app",      "name": "app",      "instances": [        {          "attributes": {            "name": "app-iac-demo-dev-k3x9p",            "location": "switzerlandnorth",            "https_only": true,            "service_plan_id": "/subscriptions/…/asp-iac-demo-dev"          }        }      ]    },    { "type": "azurerm_service_plan", … },    { "type": "azurerm_resource_group", … }  ]}
Was ist drin?

Eine Liste aller Ressourcen, die Terraform verwaltet, mit ihren aktuellen Eigenschaften und IDs.

Wann wird sie geschrieben?

Bei jedem terraform apply. Ohne Einstellung landet sie lokal auf dem eigenen Rechner.

Best Practice 1Nie von Hand bearbeiten

Es ist nur JSON, man könnte es theoretisch direkt ändern. Nicht tun. Nur über Terraform-Befehle: terraform apply, für Spezialfälle terraform state.

Best Practice 2Im Team: ein gemeinsamer Remote State

Alle brauchen denselben, aktuellen State. Er gehört in einen geteilten Speicher mit Sperre (Locking).

Terraform Enterprise (bei uns)HCP TerraformAzure Blob StorageAmazon S3Google Cloud Storage
Ins Git*.tf, *.tfvars, .terraform.lock.hcl
Nicht ins Gitterraform.tfstate: kann Passwörter enthalten, keine Sperre, Konflikte bei parallelen Änderungen
Fazit

Code im Git, State im Remote Backend. Und den State nur von Terraform anfassen lassen.

12Werkzeuge

Module: wiederverwendbare Bausteine

Ein Modul ist ein Ordner mit .tf-Dateien. Es bündelt mehrere Ressourcen zu einem Baustein, ähnlich wie eine Funktion im Code.

Das Modul · einmal gebaut


        

Darin stecken, für alle gleich:

Die Nutzung · wenige Zeilen


        

Angegeben wird nur, was sich unterscheidet. Alles andere kommt aus dem Modul.

Wann lohnt sich ein Modul? Beispiel: drei Web Apps

Ohne ModulDer Code der Web App wird dreimal kopiert, je etwa 60 Zeilen. Soll TLS auf 1.3 erhöht werden, muss man es an drei Stellen ändern. Eine Stelle wird leicht vergessen.
Mit ModulDrei Aufrufe mit je 8 Zeilen. TLS wird einmal im Modul geändert und als neue Version veröffentlicht. Alle Apps übernehmen sie mit dem nächsten Update.
FaustregelSinnvoll, wenn dieselbe Kombination von Ressourcen mehrmals gebraucht wird oder Standards überall gelten sollen. Für eine einmalige Ressource braucht es kein Modul.
Fazit

Ein Plattform-Team pflegt die Module, die anderen Teams nutzen sie. Abgelegt werden sie in der privaten Registry von Terraform Enterprise.

13Werkzeuge

Die Befehle: init, refresh, plan, apply, destroy

Beispiel: Der Code verlangt 3 VMs und eine Firewall-Regel. Jemand hat vm-2 im Portal gelöscht. Was macht Terraform bei jedem Befehl?

Code · gewünscht

Tipp: Auf ein Element klicken zeigt den Terraform-Code dazu.

liest

Terraform

Provider: noch nicht geladen
kein Plan
vergleicht

State · bekannt

ändert

Azure · Realität

Fazit

refresh holt den Ist-Zustand, plan zeigt die Differenz ohne etwas zu ändern, erst apply setzt um.

14Workflow

App Service im Portal und in Terraform

Portal › Ressource erstellen
Marketplace
Web App
    Portal1Schritte, 1 Umgebung
    Terraform3Befehle: init, plan, apply
    main.tfmarkiert = aktueller Klick
    
          
    Fazit

    Jede Einstellung aus dem Portal steht als Zeile im Code.

    15Workflow

    Der Terraform-Workflow

    Infrastruktur ist nie fertig. Im Laufe des Projekts braucht es oft weitere Instanzen, eine Datenbank oder mehr Security. Dann müssen bestehende Umgebungen verwaltet werden. Mit Terraform heisst das: Code anpassen, plan, apply.

    + erstellen ~ ändern − löschen -/+ ersetzen So zeigt plan jede Änderung an, bevor etwas passiert.
    ~/iac-demo
    
          
    Fazit

    plan zeigt alle Änderungen vor der Ausführung, auch manuelle Änderungen im Portal.

    16Ausblick

    Cloud-Anbieter und weitere Provider

    Grosse Cloud-Anbieter mit Region Schweiz

    • Microsoft Azure Zürich, Genf · bei uns im Einsatz
    • Amazon Web Services Zürich
    • Google Cloud Zürich

    Schweizer Anbieter

    • Exoscale Zürich, Genf
    • cloudscale.ch Zürich
    • Infomaniak über OpenStack

    Beispiel-Konfiguration

    Aufbau: zuerst den provider konfigurieren, dann die resource beschreiben.
    
        
    Weitere Provider (Auswahl):
    Entra IDAzure DevOpsAKS / KubernetesGitHubDNSMonitoringFirewalls
    Fazit

    Provider gibt es für Cloud-Plattformen und für andere Dienste mit einer API. Aufbau und Befehle sind dabei gleich.

    17Ausblick

    Mögliche nächste Schritte

    1. Pilot

      Eine dev-Umgebung komplett in Terraform.

    2. Terraform Enterprise

      Lizenz klären. State, Rechte und Policies zentral verwalten.

    3. Pipeline

      plan im Pull Request, apply nach Freigabe in Terraform Enterprise.

    4. Standard

      Eigene Module, bestehende Ressourcen importieren.

    Fazit

    Mit einer Umgebung starten und Erfahrungen sammeln.