Terraform-Module

Terraform Module



In der Welt der Infrastrukturbereitstellung und -verwaltung hat sich Terraform zu einer beliebten Wahl bei Entwicklern und Betriebsteams entwickelt. Mit seiner deklarativen Syntax (HCL – HashiCorp Configuration Language) und der Unterstützung verschiedener Infrastrukturanbieter ermöglicht Terraform Infrastructure-as-Code (IaC)-Praktiken.

Eines seiner Hauptmerkmale ist die Verwendung von Modulen, die die Erstellung und Wiederverwendung des modularen Infrastrukturcodes ermöglichen. In diesem Artikel befassen wir uns mit dem Konzept der Terraform-Module und wie sie dabei helfen können, unseren Infrastrukturcode zu organisieren und zu vereinfachen.







Einführung in Terraform-Module

Terraform-Module sind eigenständige Pakete von Terraform-Konfigurationen, die eine Reihe von Ressourcen mit definierten Eingabe- und Ausgabevariablen darstellen. Sie bieten eine Möglichkeit, den Infrastrukturcode zu kapseln und wiederzuverwenden, was die Verwaltung und Wartung komplexer Infrastrukturbereitstellungen erleichtert.



Module können intern innerhalb eines Projekts erstellt und verwendet oder über mehrere Projekte oder Teams hinweg geteilt werden.



Organisation des Moduls

Bei der Organisation der Terraform-Module ist es üblich, eine hierarchische Struktur zu verwenden, die aus Stamm- und untergeordneten Modulen besteht. Lassen Sie uns untersuchen, wie diese Organisation funktioniert.





Root-Modul



Das Root-Modul stellt das Modul der obersten Ebene in unserer Terraform-Konfiguration dar. Es ist der Einstiegspunkt für die Definition der gesamten Infrastruktur und die Verwaltung der Beziehungen zwischen verschiedenen Ressourcen.

Das Root-Modul enthält normalerweise die Datei „main.tf“, in der wir die Ressourcen und Konfigurationen definieren, die die Grundlage unserer Infrastruktur bilden. Optional können wir die Dateien „variables.tf“ und „outputs.tf“ dabeihaben. Außerdem können wir unser „Modules“-Verzeichnis im Stammverzeichnis definieren, um einfach auf die untergeordneten Module zuzugreifen.

Untergeordnete Module

Untermodule sind modulare Komponenten, die bestimmte Ressourcensätze oder Konfigurationen kapseln. Sie sind auf Wiederverwendbarkeit ausgelegt und stellen in sich geschlossene Einheiten der Infrastrukturfunktionalität dar.

Untergeordnete Module können innerhalb des Stammmoduls oder anderer untergeordneter Module verwendet werden, die eine Komposition und den Aufbau einer komplexen Infrastruktur ermöglichen. Jedes untergeordnete Modul verfügt normalerweise über ein eigenes Verzeichnis, das die erforderlichen Konfigurationsdateien wie „main.tf“, „variables.tf“ und „outputs.tf“ enthält.

Sehen wir uns nun an, wie wir ein Terraform-Modul erstellen können.

Erstellen eines Terraform-Moduls

Beim Erstellen von Terraform-Modulen müssen wir ein neues Verzeichnis für das Modul mit den erforderlichen Terraform-Konfigurationsdateien erstellen. Normalerweise heißt dieses Verzeichnis „Module“. Es ist eine bewährte Methode, es im Stammverzeichnis unseres Projekts zu definieren.

Nehmen wir ein einfaches Beispiel für ein einfaches Modul zur Bereitstellung eines lokalen Webservers mithilfe von Docker. Zuerst definieren wir das Modul im Verzeichnis „modules“ als „main.tf“.

Ressource „docker_container“ „Webserver“ {
name  = var.name
image = var.image
Häfen {
internal = var.internal_port
external = var.external_port
}
}

Hier erstellen wir ein Modul namens „docker_container“, das den Containernamen, das Docker-Image, den internen Port und den externen Port als Eingabevariablen verwendet. Das Modul kapselt die Logik zum Erstellen einer Docker-Container-Ressource und ermöglicht es dem Aufrufer, die Eigenschaften des Containers anzupassen.

Wie in der folgenden Abbildung gezeigt, erstellen wir eine separate Datei mit dem Namen „variables.tf“ im Verzeichnis „modules“, um die Eingabevariablen zu definieren, die bei Verwendung des Moduls angepasst werden können:

Variable 'Name' {
Beschreibung = „Name des Docker-Containers“
Typ = Zeichenfolge
}

Variable 'Bild' {
Beschreibung = „Docker-Image“
Typ = Zeichenfolge
}

Variable „internal_port“ {
Beschreibung = „Interner Port am Docker-Container“
Typ = Zahl
}

Variable „external_port“ {
Beschreibung = „Externer Port, dem zugeordnet werden soll“
Typ = Zahl
}

Hier haben wir vier Variablen deklariert, jede mit „Beschreibung“ und „Typ“ als Attribute und relevanten Werten für sie.

Verwendung eines Terraform-Moduls

Da wir unser Modul erstellt haben, können wir es nun in unserer Haupt-Terraform-Konfiguration verwenden, indem wir auf seine Quelle verweisen. Erstellen wir unsere Hauptkonfigurationsdatei „main.tf“ im Stammverzeichnis.

Modul „webserver_container“ {
Quelle = '../modules/docker_container'
Name            = „mein Webserver“
Bild           = „nginx:latest“
internal_port   = 80
external_port   = 8080
}

Wir verwenden den „Module“-Block im vorherigen Code, um das Docker-Containermodul zu instanziieren. Wir stellen die notwendigen Eingabewerte für das Modul bereit, wie den Containernamen, das Docker-Image und die Portkonfiguration. Der Parameter „source“ gibt den relativen Pfad zum Verzeichnis „module“ an.

Sehen wir uns als Nächstes an, wie die Terraform-Ausgaben für die Verwendung mit Modulen verwendet werden.

Modulausgänge

Modulausgaben in Terraform bieten eine Möglichkeit, bestimmte Werte innerhalb eines Moduls verfügbar zu machen und sie für die Verwendung in der Hauptkonfiguration oder durch andere Module verfügbar zu machen. Sie dienen als Kommunikationskanal zwischen dem Modul und dem Anrufer, der es dem Modul ermöglicht, Informationen oder Daten bereitzustellen, die für die weitere Konfiguration oder Entscheidungsfindung nützlich oder notwendig sein können.

Ausgang „container_id“ {
Beschreibung = „ID des erstellten Docker-Containers“
Wert       = docker_container.webserver.id
}

Hier haben wir eine „outputs.tf“-Datei im Verzeichnis „modules“ erstellt. Diese Ausgabevariable stellt die ID des Docker-Containers bereit, der von der „docker_container“-Ressource mit dem Namen „webserver“ innerhalb des Moduls erstellt wird.

Jetzt können wir auf die Container-ID in unserer Root-Konfigurationsdatei zugreifen. Sehen Sie sich den folgenden aktualisierten Code der Datei „main.tf“ im Stammverzeichnis an:

Modul „webserver_container“ {
Quelle = '../modules/docker_container'
Name            = „mein Webserver“
Bild           = „nginx:latest“
internal_port   = 80
external_port   = 8080
}

Ressource „docker_volume“ 'Daten' {
# Der Rest der Argumente kommt hierher
binden = module.webserver_container.container_id
}

Indem wir „module.webserver_container.container_id“ als Wert für das „bind“-Argument verwenden, weisen wir Terraform an, das Docker-Volume an den Speicherort zu binden, der durch die Container-ID des „web_container“-Moduls angegeben wird. Dadurch wird eine Beziehung zwischen der Docker-Volume-Ressource und dem Container hergestellt, der vom Modul „webserver_container“ erstellt wird, wodurch sichergestellt wird, dass das Volume am richtigen Ort bereitgestellt wird.

Best Practices für Terraform-Module

Modularisieren Sie für Wiederverwendbarkeit

Bei der Gestaltung der Module sollten wir die Wiederverwendbarkeit berücksichtigen. Außerdem müssen wir die logischen Komponenten oder Muster unserer Infrastruktur identifizieren und sie in separate Module kapseln. Dies fördert die Wiederverwendung von Code, die Standardisierung und eine einfachere Zusammenarbeit zwischen Teams.

Klare und konsistente Benennung

Die Verwendung klarer und konsistenter Namenskonventionen für Module, Variablen und Ressourcen verbessert die Lesbarkeit und das Verständnis der Codebasis, wodurch es für andere einfacher wird, mit den Modulen zu arbeiten und sie zu warten.

Abhängigkeiten isolieren

Wir müssen eine enge Kopplung zwischen Modulen vermeiden. Jedes Modul sollte seine eigenen Ressourcen und Abhängigkeiten kapseln. Dies stellt sicher, dass die Module unabhängig voneinander wiederverwendet werden können und fördert eine bessere Isolierung und Kapselung.

Versionskontrolle und Modulregistrierung

Wir können unsere Module in einem versionierten Repository oder einer Modulregistrierung veröffentlichen. Dies bietet einen zentralen Ort zum Teilen und Erkennen von Modulen und gewährleistet so einen einfachen Zugriff und eine einfache Versionierung.

Abschluss

Wir haben eine kurze Einführung in Terraform-Module erhalten und anhand eines einfachen Beispiels gelernt, wie man sie erstellt. Anschließend haben wir untersucht, wie wir die Variablen und Ausgaben mit unserem Modul nutzen können, um dessen Flexibilität, Wiederverwendbarkeit und Wartbarkeit zu verbessern. Zusammenfassend lässt sich sagen, dass Terraform-Module leistungsstarke Werkzeuge zur Organisation und Vereinfachung des Infrastrukturcodes sind. Sie ermöglichen es uns, eine Reihe von Ressourcen oder Konfigurationen in wiederverwendbare Komponenten zu kapseln und so Modularität, Wiederverwendbarkeit und Zusammenarbeit innerhalb unserer Infrastructure-as-Code-Projekte zu fördern.