Mit ARM-Templates unterstützt der Azure Resource Manager als zentrale Deployment Engine eigens ein deklaratives Bereitstellung-Paradigma. Doch es kann es sich auch lohnen, zu diesen Zweck auf das Multitalent Terraform von Hashicorp zu setzen.
Unabhängig technologischer Unterschiede, bzw. Vor- oder Nachteile zwischen ARM und Terraform kann es durchaus sein, das Unternehmen bereits über umfangreiche Terraform-Expertise verfügen. Warum also nicht einfach darauf aufbauen, statt sich auf ein neues Modell einzulassen.
Nachdem wir Ihnen in den zurückliegenden Beiträgen gezeigt haben, wie und mit welchen Werkzeugen Sie Bereitstellungen in Azure mit ARM und Bicep durchführen können, werfen wir mit diesem Beitrag einen Blick auf Terraform, insbesondere die Integration von Terraform mit der Azure Platform.
Dazu zeigen wir Ihnen exemplarisch wie Sie eine Azure Resource, wie z. B. ein virtuelles Netzwerk mit Hilfe von Terraform in Azure bereitstellen können. Für das weitere Verständnis ist es ausnahmsweise sinnvoll, das Pferd von hinten aufzuzäumen und einen Blick auf das fertige Terraform-Deployment-Skript für dieses Beispiel zu werfen.
Dazu ist es vorab sinnvoll, in Visual Studio Code die Erweiterung „Azure Terraform“ zu installieren: Visual Studio Code weist Sie sogar automatisch darauf hin, dass der Marketplace passende Erweiterungen für *.tf-Dateien enthält, sobald Sie eine Datei mit der Endung .tf speichern.
Installieren Sie jetzt die beiden Erweiterungen „Terraform“ und „Azure Terraform“. Solbad die Erweiterungen installiert ist, verfügen Sie unter anderem über eine Autovervollständigung für Terraform-Syntax und fertige tf-Dateien werden Ihnen mit Syntax-Highlighting angezeigt.
Inhaltlich sieht unsere Datei so aus:
provider „azurerm“ {
features {}
}
resource „azurerm_resource_group“ „tf-rg“ {
name = „td-tf-rg0“
location = „East US“
}
resource „azurerm_network_security_group“ „tf-rg“ {
name = „td-tf-SecurityGroup1“
location = azurerm_resource_group.tf-rg.location
resource_group_name = azurerm_resource_group.tf-rg.name
}
resource „azurerm_virtual_network“ „tf-rg“ {
name = „td-vnet-tf“
location = azurerm_resource_group.tf-rg.location
resource_group_name = azurerm_resource_group.tf-rg.name
address_space = [„10.0.0.0/16“]
subnet {
name = „Frontend“
address_prefix = „10.0.0.0/24″‚
security_group = azurerm_network_security_group.tf-rg.id
}
subnet {
name = „Backend“
address_prefix = „10.0.2.0/24“
}
}
Unschwer zu erkennen ist in Zeile 1, dass man einen Terraform Resource Provider für Azure benötigt. Dieser heißt „azurerm“. Auf der Terraform-Registry-Seite ist zu erkennen, dass Terraform zahlreiche Provider für die unterschiedlichsten Partner-Lösungen zur Verfügung stellt.
Die weiteren Einträge im oben gezeigten Terraform-Bereitstellungsskript sind weitgehend selbsterklärend und wie bei ARM formal in JSON verpackt.
Das Skript stellt ein virtuelles Netzwerk namens „td-vnet-tf“ mit dem Adressbereich 10.0.0.0/16 in einer Ressourcengruppe „tf-rg“ mit zwei Subnetzen „Frontend“ (10.0.0.0/24) und „Backend“ (10.0.1.0/24) sowie eine Netzwerksicherheitsgruppe „td-tf-SecurityGroup1“ bereit, die mit dem Subnetz „Frontend“ assoziiert wird. Die zugehörigen Ressource-Typen heißen in Terraform-Syntax „azurerm“ (Terraform Provider), „azurerm_resource_group“ (Azure Resource Group), „azurerm_virtual_network“ (Azure Virtual Network) und „azurerm_network_security_group“ (Azure Security Group).
Das eigentliche Bereitstellen dieser Terraform-Datei kann auf vielerlei Arten erfolgen. Theoretisch können Sie Ihre Terraform-Entwicklungsumgebung z. B. auf einer Azure-VM betreiben. Das ist aber meist gar nicht notwendig, weil z. B. die Azure Cloud Shell bereits mit einer Terraform-Integration ausgestattet ist. Starten Sie also einfach eine BASH-Sitzung in der Azure Cloud Shell und überprüfen z. B. erst einmal die installierte Terraform-Version mit …
terraform version
Dabei werden Sie vermutlich feststellen, dass es eigentlich bereits eine neue Terraform-Version gibt, die Sie allerdings in der Azure Cloud Shell nicht installieren können, wohl aber in einer lokal ausgeführten Azure CLI. Nun erstellen Sie einen Ordner für Ihr Projekt, wechseln in Diesen, erstellen darin z. B. mit Hilfe des eingebauten VS Code-Editors („code“ eingeben) oder mit „nano“ oder „vi“ eine neue Datei vnet.tf mit dem oben gezeigten Inhalt und speichern sie in diesem Ordner ab.
Arbeiten mit Terraform
Der zentrale Terraform-Workflow besteht aus drei Hauptschritten, sobald die Terraform-Konfiguration vorliegt:
- 1. „Initialize“(„terraform init“) bereitet das Arbeitsverzeichnis vor, damit Terraform die Konfiguration ausführen kann.
- 2. „Plan“ („terraform plan“) zeigt Änderungen in der Vorschau an, bevor Sie sie anwenden.
- 3. „Apply“ („terraform apply) führt die von Ihrer Terraform-Konfiguration definierten Änderungen aus, um Ressourcen zu erstellen, zu aktualisieren oder zu löschen.
Sie müssen also zuerst mit …
terraform init
eine Terraform-Initialisierung durchführen. Dabei werden unter anderem die Terraform-Resource-Provider ermittelt.
Eigentlich könnten Sie Ihre Datei „vnet.tf“ direkt bereitstellen. Besser (für die spätere Anwendung in größeren Umgebungen) Sie lassen sich die durch die Bereitstellung erwartbaren Änderungen wie folgt als Vorschau anzeigen.
terraform plan -out vnet.tfplan
Das Ergebnis sollte so aussehen, wie in der nachfolgenden Bildergalerie, die dann noch die eigentliche Bereitstellung zeigt.
Im nächsten Teil werden wir uns dann ausführlich mit dem Terraform CDK befassen und uns einige Azure-Beispiele in Java und Python ansehen.