Dmitry Nikolaev - stock.adobe.co

Wie Sie Azure mit Terraform und PowerShell automatisieren

Um Ressourcen in Azure automatisiert bereitzustellen, können Admins auf Terraform und auf die PowerShell setzen. Der Beitrag zeigt die Möglichkeiten und Vorteile dabei.

Geht es um die Automatisierung in Azure, können Admins auf verschiedene Tools setzen. Beispiele dafür sind Terraform, aber auch die PowerShell. Wir zeigen in diesem Beitrag, was dabei wichtig ist, und wie die Abläufe dabei sind. Terraform ist ein Open-Source-Tool, das es ermöglicht, Infrastruktur in der Cloud, wie etwa in Azure, als Code zu definieren und automatisiert bereitzustellen. Im Gegensatz zur manuellen Bereitstellung von Ressourcen über grafische Oberflächen ermöglicht Terraform, Infrastrukturzustände deklarativ zu beschreiben und somit den gewünschten Endzustand festzulegen, ohne sich um die Ausführungsschritte kümmern zu müssen. Das wird als Desired State bezeichnet, bei dem Terraform automatisch prüft, ob der aktuelle Zustand der Infrastruktur vom gewünschten Zustand abweicht und nur dann Änderungen vornimmt, wenn nötig.

Ein großer Vorteil von Terraform besteht darin, dass bei mehrfacher Ausführung des gleichen Skripts keine Fehler auftreten, wenn der Zielzustand bereits erreicht wurde. Dadurch lassen sich komplexe Infrastrukturen, wie zum Beispiel virtuelle Netzwerke oder Domain Controller für Azure Virtual Desktop, effizient und fehlerfrei verwalten. Die Nutzung von Terraform erleichtert somit die Verwaltung großer Cloud-Infrastrukturen und sorgt für Konsistenz und Wiederholbarkeit in der Bereitstellung.

Infrastructure as Code ermöglicht schnellere und sichere Bereitstellung von Azure-Ressourcen

Mit Infrastructure as Code (IaC) lassen sich komplexe Bereitstellungen in Azure mit Skripten und damit einheitlich erstellen. Die Bereitstellung von Ressourcen mit Infrastructure as Code in Azure bietet erhebliche Vorteile, die vor allem in der Automatisierung, Skalierbarkeit und Konsistenz liegen. Durch die Nutzung von IaC-Tools wie ARM Templates, Bicep oder Terraform können Infrastrukturkonfigurationen in Code festgehalten und versioniert werden, was eine einfache Reproduzierbarkeit und Nachvollziehbarkeit ermöglicht.

Initialisierung von Terraform
Abbildung 1: Initialisieren Sie Terraform zur Ausführung von Skripten.

Änderungen an der Infrastruktur lassen sich durch Code-Änderungen effizient und ohne manuelle Eingriffe vornehmen, was den Aufwand reduziert und Fehlerquellen minimiert. Zudem sorgt IaC für Konsistenz über verschiedene Umgebungen hinweg, indem identische Konfigurationen mehrfach in Entwicklungs-, Test- und Produktionsumgebungen angewendet werden können. Die schnelle Skalierbarkeit ist ein weiterer wesentlicher Vorteil, da Ressourcen auf Abruf gemäß den Vorgaben im Code erweitert oder reduziert werden können. Das erhöht nicht nur die Flexibilität, sondern auch die Effizienz in der Verwaltung und im Betrieb von Cloud-Infrastrukturen in Azure.

Terraform steht auch kostenlos zur Verfügung

Um sich in Terraform einzuarbeiten, können Admins auf die kostenlose Community Edition setzen. In produktiven Umgebungen stehen verschiedene Lizenzen von Terraform zur Verfügung. Diese bieten unter anderem mehr Support. Die kostenpflichtigen Editionen ermöglichen darüber hinaus die Bereitstellung zahlreicher Ressourcen. Die Skripte werden mit JSON und HCL geschrieben. Die Verwendung von Terraform erfolgt direkt in der Shell oder Befehlszeile.

Mit terraform- help zeigt das Tool eine komplette Hilfe an. Für jeden Parameter gibt es weitere Hilfen. Diese lassen sich zum Beispiel mit terraform help plan abrufen, in diesem Fall für den Parameter plan. Danach lassen sich die Skripte mit terraform init initialisieren und mit terraform apply umsetzen. Für diese Parameter bietet Terraform ebenfalls Hilfen an. Bereits vorhandene Umgebungen können mit terraform refresh aktualisiert werden. Rückgängig machen lassen sich Aktionen mit terraform destroy. Alle diese Parameter lassen sich mit terraform -help <Parameter> erklären. Umfangreichere Informationen sind in der Dokumentation von Terraform zu finden.

Hilfe in Terraform
Abbildung 2: Terraform bietet auch eine umfassende Hilfe an.

Ein typisches Terraform-Skript zur Erstellung von zwei Azure-VMs umfasst die Definition von Ressourcen wie der Ressourcengruppe, dem virtuellen Netzwerk, Subnetzen, Netzwerkschnittstellen und den virtuellen Maschinen selbst. Hier ist ein Beispielskript:

provider "azurerm" {
  features {}
}

Folgende Variablen können Sie für die Flexibilität einsetzen:

variable "admin_username" {
  description = "Administrator-Benutzername"
  type        = string
}
variable "admin_password" {
  description = "Administrator-Passwort"
  type        = string
  sensitive   = true
}
variable "resource_group_name" {
  description = "Name der Ressourcengruppe"
  type        = string
  default     = "myResourceGroup"
}
variable "location" {
  description = "Azure-Standort"
  type        = string
  default     = "West Europe"
}

Das Skript ist für die Ressourcengruppe:

resource "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
  location = var.location
}

Dieses Skript ist für das virtuelle Netzwerk:

resource "azurerm_virtual_network" "vnet" {
  name                = "myVNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

Dieses Skript ist für das Subnetz zuständig:

resource "azurerm_subnet" "subnet" {
  name                 = "mySubnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

Skripte für die Netzwerkschnittstellen für die VMs sehen folgendermaßen auf:

resource "azurerm_network_interface" "nic" {
  count               = 2
  name                = "myNIC${count.index}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
 
  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

Wenn Sie zwei Linux-VMs erstellen, nutzen Sie das folgende Skript:

resource "azurerm_linux_virtual_machine" "vm" {
  count                 = 2
  name                  = "myVM${count.index}"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  network_interface_ids = [azurerm_network_interface.nic[count.index].id]
  size                  = "Standard_DS1_v2"
 
  admin_username = var.admin_username
  admin_password = var.admin_password
 
  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

Das Terraform-Skript zur Erstellung von zwei Azure-VMs umfasst mehrere Komponenten, die den Aufbau und die Bereitstellung der Infrastruktur automatisieren. Der erste Schritt in einem solchen Skript ist die Definition des Azure Providers. In diesem Fall wird der azurerm-Provider verwendet, der es ermöglicht, Ressourcen in Azure zu verwalten. Durch die Deklaration von features {} wird sichergestellt, dass alle standardmäßigen Funktionen des Providers genutzt werden können.

Um das Skript flexibel zu gestalten, werden Variablen für den Administrator-Benutzernamen und das Passwort definiert. Diese ermöglichen es Administratoren, die Anmeldedaten dynamisch anzupassen, ohne das Hauptskript verändern zu müssen. Die Definition der Variablen erfolgt mit variable und sensible Informationen wie das Passwort werden als sensitive = true markiert, um sicherzustellen, dass sie nicht in den Logs ausgegeben werden. Außerdem wird eine Variable für den Namen der Ressourcengruppe und den Azure-Standort definiert. Der Standardstandort ist hier West Europe, kann aber flexibel angepasst werden.

Die Ressourcengruppe, in der alle Ressourcen organisiert werden, wird durch die Ressource azurerm_resource_group erstellt. Die Ressourcengruppe fasst alle zugehörigen Objekte wie Netzwerke und virtuelle Maschinen zusammen, sodass sie gemeinsam verwaltet werden können. Anschließend wird ein virtuelles Netzwerk (azurerm_virtual_network) mit einem definierten Adressbereich erstellt, das die Grundlage für die Netzwerkkommunikation der virtuellen Maschinen bildet. Das Subnetz (azurerm_subnet) wird als Teil des virtuellen Netzwerks erstellt und definiert den spezifischen IP-Bereich, den die VMs nutzen werden.

Jede virtuelle Maschine benötigt eine Netzwerkschnittstelle, um mit dem Netzwerk verbunden zu werden. Daher erstellt das Skript zwei Netzwerkschnittstellen mit der Ressource azurerm_network_interface. Die count-Anweisung sorgt dafür, dass zwei Netzwerkschnittstellen generiert werden, wobei jeder eine dynamische private IP-Adresse zugewiesen wird.

Die eigentlichen VMs werden mit der Ressource azurerm_linux_virtual_machine erstellt. Auch hier wird count verwendet, um zwei Maschinen zu erzeugen. Jede VM wird mit einem Netzwerk-Interface verbunden, nutzt den Standard_DS1_v2-Maschinentyp und wird mit Ubuntu 18.04. LTS als Betriebssystem gestartet. Administrator-Benutzername und Passwort stammen aus den zuvor definierten Variablen. Die VMs nuten eine Standardfestplatte (Standard_LRS) und können für den spezifischen Anwendungsfall durch andere Einstellungen wie SSH-Keys oder größere Festplatten erweitert werden.

Administratoren können dieses Skript auf verschiedene Weise anpassen und verwenden. Zunächst muss die Authentifizierung in Azure eingerichtet werden, was normalerweise durch das Anmelden mit dem Azure-CLI-Befehl az login funktioniert. Danach erfolgt die Initialisierung von Terraform mit terraform init, um alle notwendigen Plug-ins herunterzuladen. Der nächste Schritt ist die Ausführung von terraform plan, um einen Überblick über die zu erstellenden Ressourcen zu erhalten. Wenn alle Ressourcen korrekt definiert sind, kann mit terraform apply die Bereitstellung der VMs und der dazugehörigen Ressourcen durchgeführt werden.

Für eine flexible Nutzung empfiehlt es sich, eine separate terrform.tfvars-Datei zu erstellen, in der Variablen wie der Administratorname und das Passwort gesetzt werden. Dadurch können Änderungen an diesen Werten vorgenommen werden, ohne das Hauptskript anzupassen. Alternativ können die Variablen auch direkt in der Kommandozeile beim Ausführen des Terraform-Befehls übergeben werden.

Das Skript bietet eine solide Grundlage für die Bereitstellung von zwei Azure-VMs und kann leicht erweitert werden, um zusätzliche VMs, Netzwerke oder andere Azure-Ressourcen bereitzustellen. Anpassungen wie die Nutzung von SSH-Schlüsseln statt Passwörtern, andere Betriebssystem-Images oder VM-Typen können problemlos vorgenommen werden. Wichtig ist, dass Administratoren sicherstellen, dass alle Ressourcen in einer sicheren und skalierbaren Weise bereitgestellt werden, um die langfristige Verwaltung und den Betrieb in Azure zu optimieren.

Best Practices bei der Nutzung von Terraform in Azure

Neben den grundlegenden Vorteilen, die Terraform bei der Bereitstellung von Ressourcen in Azure bietet, wie Automatisierung und Wiederholbarkeit, gibt es fortgeschrittene Techniken, die den Einsatz von Terraform noch effizienter gestalten. Eine zentrale Rolle spielt dabei die Trennung der Terraform-Konfigurationen in verschiedenen Dateien, um die Verwaltung komplexer Infrastrukturen zu erleichtern. So wird zum Beispiel empfohlen, für jeden Infrastrukturtyp (virtuelle Maschinen, Netzwerke, Datenbanken) eigene Terraform-Dateien zu erstellen. Zudem sollte ein Remote-Backend eingerichtet werden, das den Terraform-Statusdateien einen sicheren und zentralen Speicherort bietet. In Azure kann das über Azure Storage erfolgen, sodass Teams gemeinsam und synchronisiert arbeiten können, ohne dass lokale Statusdateien, zum Beispiel für Entwicklungs-, Test- und Produktionsumgebungen, die Anpassung von Terraform-Konfigurationen für verschiedene Szenarien.

Tiefgehende Integration von Terraform mit dem Azure Provider: Verwaltung und Automatisierung großer Infrastrukturen

Terraform entfaltet sein volles Potenzial in der Cloud-Infrastrukturverwaltung durch die enge Integration mit verschiedenen Cloud-Anbietern. In Azure wird das durch den Azure Provider erreicht, der es ermöglicht, sämtliche Azure-Ressourcen programmgesteuert und automatisiert zu verwalten. Dieser Provider agiert als zentrale Komponente, die es Terraform ermöglicht, direkt mit den Azure-APIs zu kommunizieren und die Bereitstellung von Infrastrukturressourcen wie virtuellen Maschinen, Speicherkonten, Netzwerken oder Kubernetes-Clustern zu steuern. Durch die Definition der Ressourcen in HCL (HashiCorp Configuration Language), einer deklarativen Sprache, wird nicht nur festgelegt, welche Ressourcen erstellt werden sollen, sondern auch, in welchem Zustand diese existieren müssen. Terraform führt die notwendigen Änderungen autonom durch, um den gewünschten Endzustand zu erreichen, ohne dass der Nutzer sich um die einzelnen Konfigurationsschritte kümmern muss.

Ein zentrales Element der Bereitstellung mit Terraform ist das State Management. Der sogenannte State speichert den aktuellen Zustand der Infrastruktur und dient Terraform als Referenz, um den Unterschied zwischen dem gewünschten und dem bestehenden Zustand zu erkennen. Bei jeder Ausführung von terraform apply liest das Tool diesen State, vergleicht ihn mit der aktuellen Konfiguration und ermittelt die nötigen Anpassungen. In Azure kann dieser State in einem Azure-Storage-Konto abgelegt werden, was nicht nur das Arbeiten in Teams erleichtert, sondern auch eine zentrale und zuverlässige Speicherlösung bietet. Das reduziert das Risiko von Inkonsistenzen, die durch lokale Speicherung des State entstehen könnten.

Zusätzlich ermöglicht der Azure Provider durch seine enge Integration mit anderen DevOps-Tools wie dem Azure CLI eine nahtlose Authentifizierung und Kommunikation zwischen Terraform und Azure. So können verschiedene Authentifizierungsmethoden, wie das Azure CLI, Service Principals oder Managed Service Identities, verwendet werden, um Terraform-Prozesse sicher und zuverlässig in die Azure-Umgebung einzubinden. Dabei greift der Azure Provider auf eine Vielzahl von nativen Azure-Ressourcen zu, die kontinuierlich erweitert werden. Aktuell unterstützt der Provider über 1.000 verschiedene Ressourcen und Datendienste, was die Flexibilität und Skalierbarkeit von Terraform in Azure-Umgebungen deutlich erweitert.

Ein weiterer wesentlicher Aspekt des Azure Providers ist seine Fähigkeit, Multi-Environment-Strategien zu unterstützen. In komplexen Infrastrukturen wird oft zwischen Entwicklungs-, Test- und Produktionsumgebungen unterschieden. Durch den Einsatz von Variablen und Umgebungsdateien, zum Beispiel dev.tfvars, prod.tfvars können unterschiedliche Konfigurationen für verschiedene Umgebungen bereitgestellt werden. Das ermöglicht es, dieselbe Terraform-Konfiguration flexibel für verschiedene Umgebungen zu nutzen, ohne manuelle Anpassungen vornehmen zu müssen. Dadurch wird nicht nur die Konsistenz zwischen den Umgebungen gewahrt, sondern auch der gesamte Bereitstellungsprozess erheblich beschleunigt.

Ein weiteres fortgeschrittenes Konzept ist die idempotente Natur von Terraform, die sicherstellt, dass wiederholte Ausführungen von Konfigurationen keine ungewollten Änderungen an der Infrastruktur vornehmen, solange sich der Zielzustand nicht verändert hat. Im Zusammenspiel mit dem Konzept des Desired State wird Terraform so zu einem mächtigen Werkzeug, das es erlaubt, Infrastrukturen effizient, fehlerfrei und wiederholbar bereitzustellen und zu verwalten. Wenn eine bereits erstellte Ressource erneut im Code referenziert wird, prüft Terraform, ob diese dem gewünschten Zustand entspricht. Ist das der Fall, werden keine weiteren Aktionen durchgeführt. Nur wenn sich der Zustand der Ressource von der definierten Konfiguration unterscheidet, nimmt Terraform die notwendigen Änderungen vor. Diese Idempotenz und das deklarative Modell erleichtert die Verwaltung großer Infrastrukturen erheblich und reduzieren das Risiko von Konfigurationsfehlern.

Die Fähigkeit von Terraform, große und komplexe Infrastrukturen in einem einzigen, versionierten Code-Repository zu verwalten, bietet Unternehmen, die ihre Cloud-Umgebungen skalieren wollen, deutliche Vorteile. Durch die Nutzung von Modulen können wiederkehrende Infrastrukturkomponenten abstrahiert und wiederverwendet werden. Das führt zu einer erheblichen Reduktion des Konfigurationsaufwands und der Fehleranfälligkeit. Auch die Wartbarkeit und Erweiterbarkeit von Infrastruktur-Code wird durch den modularen Ansatz deutlich verbessert, da Änderungen in einem Modul automatisch in allen Umgebungen übernommen werden können.

Parallelbetrieb von Terraform und PowerShell für Azure Automation

Terraform ermöglicht die effiziente Bereitstellung und Verwaltung von Infrastruktur in Azure, jedoch können einige Aufgaben, insbesondere Automatisierungsprozesse wie das Ausführen von wiederkehrenden Skripten oder die Verwaltung von Anwendungen, besser oder zumindest alternativ durch PowerShell in Azure Automation erledigt werden.

Optimale Verknüpfung von Terraform und PowerShell
Abbildung 3: Terraform und PowerShell-Skripte in Azure Automation lassen sich optimal miteinander verknüpfen.

Die Integration beider Tools bietet Administratoren eine umfassende und flexible Lösung. Während Terraform die Grundinfrastruktur aufbaut, können mit Azure Automation wiederkehrende Aufgaben wie das Starten oder Stoppen von VMs automatisiert und überwacht werden. Das spart Zeit, reduziert manuelle Eingriffe und stellt sicher, dass Prozesse wie geplante Wartungen oder Updates ohne Eingriff des Administrators ablaufen.

Azure Automation erlaubt es, PowerShell-Skripte direkt in der Cloud auszuführen, ohne dass eine lokale Infrastruktur benötigt wird. Das bietet den Vorteil, dass keine eigenen Server für das Ausführen der Skripte bereitgestellt und verwaltet werden müssen. Azure stellt eine Umgebung bereit, in der die Skripte automatisch ausgeführt werden, was sowohl Kosten als auch Verwaltungsaufwand spart. Azure Automation ist besonders nützlich, wenn bereits Cloud-Ressourcen wie Microsoft 365 oder andere Dienste verwendet werden, da Automatisierungsaufgaben direkt dort ausgeführt werden können, wo sie relevant sind.

Im Automation Account können Runbooks erstellt werden. Diese Runbooks sind im Grunde die Skripte, die in Azure Automation ausgeführt werden. Azure unterstützt verschiedene Skripttypen, darunter PowerShell und Python. Neben der normalen PowerShell gibt es auch eine grafische Version, die es ermöglicht, Skriptblöcke über eine GUI zusammenzustellen, was jedoch meist weniger flexibel ist.

Nutzung mit Runbooks
Abbildung 4: PowerShell-Skripte lassen sich mit Runbooks in Azure Automation nutzen.

Azure Automation bietet 500 kostenlose Minuten pro Monat, was für Testzwecke und kleinere Automatisierungen oft ausreichend ist. Erst wenn diese Grenze überschritten wird, fallen minimale Kosten an. Durch die Möglichkeit, verwaltete Identitäten zu nutzen, können Automatisierungsaufgaben auch sicher ausgeführt werden, ohne dass zusätzliche Benutzerkonten oder Zugangsdaten erforderlich sind. Das sorgt für ein hohes Maß an Sicherheit, da Berechtigungen über die Identität des Automation Accounts zentral verwaltet werden.

Durch den Einsatz von PowerShell in Azure Automation können viele wiederkehrende Aufgaben wie das Starten oder Stoppen von VMs, das Aktualisieren von Anwendungen oder das Bereinigen von Ressourcen vollständig automatisiert werden. Dabei können auch Parameter an die Skripte übergeben werden, um die Automatisierung noch flexibler zu gestalten. Administratoren können zudem Webhooks einrichten, die es ermöglichen, Runbooks von externen Systemen oder anderen Skripten auszulösen, was die Integration in bestehende Prozesse weiter vereinfacht.

Erfahren Sie mehr über Data-Center-Betrieb