Getty Images/iStockphoto

Terraform-Module verwenden anhand von Anwendungsbeispielen

Der Einsatz von Modulen kann die Benutzerfreundlichkeit von Terraform verbessern. Erfahren Sie, was ein Modul ist, wann Sie es verwenden und gehen Sie einige Beispiele durch.

Infrastructure as Code ist in DevOps-Toolchains von entscheidender Bedeutung. Ein beliebtes Tool, Terraform, kann von der Verwendung von Modulen profitieren, um die Konfigurationspflege zu vereinfachen.

In Terraform können Module Ressourcen in logischen Einheiten gruppieren, so dass Sie eine komplexe Konfiguration in kleinere, wiederverwendbare Komponenten aufteilen können. Auf diese Weise lässt sich eine Terraform-Konfiguration einfacher pflegen und die Redundanz zwischen mehreren Terraform-Projekten verringern. Durch das Schreiben und Nutzen von Modulen können Sie Terraform-Konfigurationen vereinfachen, die Lesbarkeit verbessern und die Wiederverwendbarkeit des Codes erhöhen.

Um Module zu nutzen, sollten Sie zunächst ein grundlegendes Verständnis von Terraform entwickeln, zum Beispiel was Terraform-Ressourcen sind und wie man sie nutzt. Dann können Sie die Arten von Ressourcen, die Sie typischerweise in Gruppen oder mehrfach einsetzen, bewerten und in Betracht ziehen, diese in Module umzuwandeln.

Wann sollte man Terraform-Module verwenden?

Wenn Sie eine Ressource oder eine Gruppe von Ressourcen mehrmals einsetzen und möglicherweise ähnliche Konfigurationen verwenden, ist es vielleicht an der Zeit, sie in einem Modul zu kombinieren. Nehmen wir zum Beispiel an, dass Sie eine Reihe von virtuellen Maschinen einsetzen, jede mit einer Festplatte, einem Netzwerk-Controller und einer statischen IP-Adresse. Durch die Kombination dieser Ressourcen entsteht eine logische Einheit, die als virtuelle Maschine für Azure oder als EC2-Instanz für AWS bezeichnet wird.

Mit dieser einzelnen Einheit, einem Modul, können Sie Parameter erstellen, um Dinge wie VM-Größe, Festplattengröße oder IP-Adresse festzulegen – jeweils mit einem intelligenten Standardwert. Wenn Sie dann eine virtuelle Maschine und alle unterstützenden Ressourcen erstellen möchten, können Sie das Modul einmal aufrufen, und es erstellt alles für Sie.

Aufbau des Moduls

Ähnlich wie das Hauptmodul der Terraform-Konfiguration sollte ein untergeordnetes Modul mindestens eine variables.tf-, eine main.tf- und eine outputs.tf-Datei im selben Ordner enthalten.

main.tf-, output.tf- und variables.tf-Datei in untergeordnetem Modell
Abbildung 1: Ein untergeordnetes Modell sollte eine main.tf-, output.tf- und variables.tf-Datei enthalten.

Die Datei varibles.tf definiert alle Eingabeparameter. Die Datei main.tf wird für das Haupt-Terraform-Skript verwendet. Die Datei output.tf wird für die Definition aller Ausgaben verwendet. Optional können Sie auch andere Teile des Moduls in eigene Dateien aufteilen, zum Beispiel den Provider-Block.

Beispiel für ein virtuelles Azure-Netzwerk

Es ist sinnlos, ein virtuelles Netzwerk in Azure ohne ein Subnetz bereitzustellen. Daher ist Azure ein guter Kandidat, um ein einfaches Modul zu schreiben, das sowohl ein virtuelles Netzwerk als auch ein Subnetz bereitstellt. Um ein Modul zu erstellen, erstellen Sie die drei erforderlichen Dateien: main.tf, varibles.tf und outputs.tf.

variables.tf

Um die Datei variables.tf zu erstellen, definieren Sie Variablen mit der folgenden Syntax.

Variable “vnet_name” {
  type        = string
  description = “Name of the vNet”
}

Fügen Sie dann die folgenden zusätzlichen Parameter hinzu:

  • resource_group_name: Name der Ressourcengruppe, in der das vNet platziert werden soll
  • location: Die Azure-Region, in der die Ressourcen platziert werden sollen
  • vnet_address_space: Adressraum, der dem vNet zugewiesen werden soll
  • subnet_name: Name des Subnetzes
  • subnet_address_space: Adressraum, der dem Subnetz zugewiesen werden soll

Wenn diese Eingabevariablen definiert sind, können Sie sie innerhalb des Terraform-Skripts mit der Syntax var.var_name referenzieren.

main.tf

Innerhalb der main.tf platzieren Sie die Ressourcen, die Sie erstellen möchten. In diesem Beispiel werden einfach ein virtuelles Netzwerk und ein Subnetz erstellt, daher gibt es die folgenden zwei Ressourcen.

resource "azurerm_virtual_network" "vnet" {
  resource_group_name = var.resource_group_name
  location            = var.location
  name                = var.vnet_name
  address_space       = [var.vnet_address_space]
}
 
resource "azurerm_subnet" "subnet" {
  resource_group_name  = var.resource_group_name
  name                 = var.subnet_name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = [var.subnet_address_space]
}

outputs.tf

Die Definition von Ausgaben für ein Terraform-Modul kann kompliziert sein, aber die allgemeine Idee ist es, Eigenschaften auszugeben, die Sie in einem übergeordneten Modul benötigen, aber nicht aus den Eingabeparametern erhalten können. Zum Beispiel werden Sie die ID des virtuellen Netzwerks nicht erkennen, bis das virtuelle Netzwerk bereitgestellt ist, also können Sie es mit den folgenden Befehlen ausgeben.

output "vnet_id" {
  description = "The ID of the vNet."
  value       = azurerm_virtual_network.vnet.id
}

Sie können eine Ausgabe für jede Ressourcenausgabe in Ihrem Terraform-Modul erstellen. Dieses Beispiel beschränkt sich auf die ID des virtuellen Netzwerks.

Ein Modul verwenden

Nachdem Sie nun ein Modul geschrieben haben, ist der nächste Schritt die Verwendung des Moduls. Nehmen Sie alle drei Dateien (variables.tf, main.tf und outputs.tf) und legen Sie sie in einem Ordner namens terraform-azurerm-vnet ab. Erstellen Sie dann im übergeordneten Ordner die Datei main.tf für das übergeordnete Modul.

Erstellung eines übergeordneten Ordners
Abbildung 2: Erstellen Sie einen übergeordneten Ordner, terraform-azurerm-vnet, um Ihr Modul zu verwenden.

Module in Terraform haben ihr eigenes Schlüsselwort, so dass Sie das Modul mit module aufrufen und den Ort des Moduls mit dem Parameter source angeben können.

module "vnet" {
  source = "./terraform-azurerm-vnet"
}

Terraform unterstützt verschiedene Quellentypen, darunter Git, die Terraform Registry und HTTP-URLs. In diesem Beispiel wird ein lokaler Pfad verwendet.

Innerhalb des Modulblocks definieren Sie die Eingabeparameter für das Modul mit den folgenden Befehlen.

module "vnet" {
  source               = "./terraform-azurerm-vnet"
  resource_group_name  = "test-rg"
  location             = "westus"
  vnet_name            = "new-vnet"
  vnet_address_space   = "10.10.0.0/16"
  subnet_name          = "subnet01"
  subnet_address_space = "10.10.10.0/24"
}

Jeder Eingabeparameter stimmt mit einer Variablen aus der Datei variables.tf überein. Wenn Sie auch die Ressourcengruppe mit Terraform erstellen müssen, können Sie das mit einer zusätzlichen Ressource in derselben main.tf-Datei tun.

resource "azurerm_resource_group" "rg" {
  name     = "test-rg"
  location = "westus"
}

Fügen Sie nun einen Provider-Block hinzu und Sie können einen Plan durchlaufen.

Durchlauf von Plänen
Abbildung 3: Terraform-Module können mit Leichtigkeit durch Pläne laufen.

Das ist ein einfaches Beispiel für die Verwendung eines Terraform-Moduls und hat daher seine Grenzen. Wenn Sie mehrere Subnetze erstellen möchte, müssen Sie das außerhalb des Moduls tun. Es gibt mehrere Möglichkeiten, dieses Modul zu erweitern, um mehrere Subnetze zu akzeptieren.

Wenn Sie mit komplexen Terraform-Konfigurationen arbeiten, ist es praktisch, eine Gruppe von Ressourcen als eine einzige Einheit mit einem Modul zu spezifizieren. Das Beispiel für ein virtuelles Netzwerk in diesem Skript ist zwar sehr einfach und spart nur ein paar Zeilen Code, aber es macht den Code lesbarer. Komplexere Module kann leicht über 100 Zeilen Code einsparen und alle VM-spezifischen Parameter in einem Modulblock zusammenfassen.

Erfahren Sie mehr über Cloud Computing