Implementieren von Integrationstests für Terraform-Projekte in Azure
Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.
Integrationstests stellen sicher, dass eine neu eingeführte Codeänderung vorhandenen Code nicht unterbricht. In DevOps bezieht sich Continuous Integration (CI) auf einen Prozess, durch den das gesamte System bei jeder Änderung der Codebasis erstellt wird, z. B. wenn eine Person einen Pull Request (PR) in einem Git-Repository zusammenführen möchte. Die folgende Liste enthält allgemeine Beispiele für Integrationstests:
- Tools für die statische Codeanalyse, z. B. „lint“ und „format“
- Ausführen von terraform validate, um die Syntax der Konfigurationsdateien zu überprüfen
- Ausführen von terraform plan, um sicherzustellen, dass die Konfiguration wie erwartet funktioniert
In diesem Artikel werden folgende Vorgehensweisen behandelt:
- Grundlegendes zu Integrationstests für Terraform-Projekte
- Konfigurieren einer Continuous Integration-Pipeline mit Azure DevOps
- Ausführen einer statischen Codeanalyse für Terraform-Code
- Ausführen von
terraform validate
, um Terraform-Konfigurationsdateien auf dem lokalen Computer zu überprüfen - Ausführen von
terraform plan
, um Terraform-Konfigurationsdateien aus der Perspektive von Remotediensten zu überprüfen - Automatisieren von Continuous Integration mit einer Azure-Pipeline
1. Konfigurieren Ihrer Umgebung
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Konfigurieren von Terraform: Konfigurieren Sie Terraform mithilfe einer der folgenden Optionen, sofern noch nicht geschehen:
Azure DevOps-Organisation und -Projekt: Wenn Sie keins haben, erstellen Sie eine Azure DevOps-Organisation.
Terraform Build & Release Tasks Erweiterung: Installieren Sie die Terraform Build/Release Tasks-Erweiterung in Ihrer Azure DevOps-Organisation.
Gewähren von Azure DevOps-Zugriff auf Ihr Azure-Abonnement: Erstellen Sie eine Azure-Dienstverbindung mit dem Namen
terraform-basic-testing-azure-connection
, damit Azure-Pipelines eine Verbindung mit Ihren Azure-Abonnements herstellen könnenBeispielcode und Ressourcen: Laden Sie das Integrationstestprojekt von GitHub herunter. Das Verzeichnis, in das Sie das Beispiel herunterladen, wird als Beispielverzeichnis bezeichnet.
2. Überprüfen einer lokalen Terraform-Konfiguration
Der Befehl terraform validate wird über die Befehlszeile im Verzeichnis mit Ihren Terraform-Dateien ausgeführt. Diese Befehle dienen in erster Linie zur Überprüfung der Syntax.
Navigieren Sie im Beispielverzeichnis zum Verzeichnis
src
.Führen Sie terraform init aus, um das Arbeitsverzeichnis zu initialisieren.
terraform init
Führen Sie terraform validate aus, um die Syntax der Konfigurationsdateien zu überprüfen.
terraform validate
Die wichtigsten Punkte:
- Eine Meldung mit dem Hinweis wird angezeigt, dass die Terraform-Konfiguration gültig ist.
Bearbeiten Sie die
main.tf
-Datei.Fügen Sie in Zeile 5 einen Tippfehler ein, durch den die Syntax ungültig wird. Ersetzen Sie beispielsweise
var.location
durchvar.loaction
.Speichern Sie die Datei .
Führen Sie die Prüfung erneut aus.
terraform validate
Die wichtigsten Punkte:
- Eine Fehlermeldung mit der fehlerhaften Codezeile und einer Beschreibung des Fehlers wird angezeigt.
Wie Sie sehen, hat Terraform ein Problem in der Syntax des Konfigurationscodes erkannt. Dieses Problem verhindert die Bereitstellung der Konfiguration.
Es empfiehlt sich, immer terraform validate
für Ihre Terraform-Dateien auszuführen, bevor Sie sie in das Versionskontrollsystem pushen. Diese Prüfung sollte auch Teil Ihrer Continuous Integration-Pipeline sein. Im weiteren Verlauf dieses Artikels erfahren Sie, wie Sie eine Azure-Pipeline für die automatische Überprüfung konfigurieren.
3. Überprüfen der Terraform-Konfiguration
Im vorherigen Abschnitt haben Sie erfahren, wie Sie eine Terraform-Konfiguration überprüfen. Bei dieser Prüfung handelte es sich um einen syntaxbezogenen Test. Bereits in Azure bereitgestellter Code wurde dabei nicht berücksichtigt.
Terraform ist eine deklarative Sprache. Dies bedeutet, dass Sie das gewünschte Endergebnis deklarieren. Angenommen, Sie haben zehn VMs in einer Ressourcengruppe. Anschließend erstellen Sie eine Terraform-Datei, die drei VMs definiert. Wenn Sie diesen Plan anwenden, erhöht sich die Gesamtanzahl nicht auf 13. Stattdessen löscht Terraform sieben der VMs, sodass Sie letztlich drei VMs haben. Durch die Ausführung von terraform plan
können Sie die potenziellen Ergebnisse der Anwendung eines Ausführungsplans überprüfen, um Überraschungen zu vermeiden.
Um den Terraform-Ausführungsplan zu generieren, führen Sie terraform plan aus. Dieser Befehl stellt eine Verbindung mit dem Azure-Zielabonnement her, um zu überprüfen, welcher Teil der Konfiguration bereits bereitgestellt wurde. Terraform ermittelt dann die Änderungen, die zum Erfüllen der genannten Anforderungen in der Terraform-Datei erforderlich sind. In dieser Phase stellt Terraform nichts bereit. Das Tool zeigt an, was passiert, wenn Sie den Plan anwenden.
Wenn Sie mit dem Artikel fortfahren und die Schritte im vorherigen Abschnitt durchgeführt haben, führen Sie nun den Befehl terraform plan
aus:
terraform plan
Nach dem Ausführen von terraform plan
zeigt Terraform das potenzielle Ergebnis der Anwendung des Ausführungsplans an. Der Ausgabe können Sie entnehmen, welche Azure-Ressourcen hinzugefügt, geändert und zerstört werden.
Standardmäßig speichert Terraform den Zustand im selben lokalen Verzeichnis wie die Terraform-Datei. Dieses Muster funktioniert in Einzelbenutzerszenarien gut. Wenn mehrere Personen jedoch an den gleichen Azure-Ressourcen arbeiten, können lokale Zustandsdateien nicht mehr synchronisiert werden. Um dieses Problem zu beheben, unterstützt Terraform das Schreiben von Zustandsdateien in einen Remotedatenspeicher (z. B. Azure Storage). In diesem Szenario kann es problematisch sein, terraform plan
auf einem lokalen Computer mit einem Remotecomputer als Ziel auszuführen. Daher ist es u. U. sinnvoll, diesen Prüfungsschritt als Teil der Continuous Integration-Pipeline zu automatisieren.
4. Ausführen einer statischen Codeanalyse
Sie können die statische Codeanalyse direkt im Terraform-Konfigurationscode durchführen, ohne den Code auszuführen. Diese Analyse eignet sich, um Probleme wie Sicherheitsprobleme und Inkonsistenzen in Bezug auf die Konformität zu erkennen.
Die folgenden Tools stellen eine statische Analyse für Terraform-Dateien bereit:
Die statische Analyse wird häufig im Rahmen einer Continuous Integration-Pipeline ausgeführt. Diese Tests erfordern weder die Erstellung eines Ausführungsplans noch eine Bereitstellung. Sie sind daher schneller als andere Tests und werden in der Regel als Erstes im Continuous Integration-Prozess ausgeführt.
5. Automatisieren von Integrationstests mit einer Azure-Pipeline
Bei Continuous Integration wird im Fall einer Änderung das gesamte System getestet. In diesem Abschnitt wird eine Azure-Pipelinekonfiguration zum Implementieren von Continuous Integration vorgestellt.
Navigieren Sie in Ihrem bevorzugten Editor zum lokalen Klon des Terraform-Beispielprojekts auf GitHub.
Öffnen Sie die Datei
samples/integration-testing/src/azure-pipeline.yaml
.Scrollen Sie nach unten zum Abschnitt steps. Dort sehen Sie die Standardschritte zum Ausführen verschiedener Installations- und Prüfungsroutinen.
Sehen Sie sich die Zeile Step 1: run the Checkov Static Code Analysis an. In diesem Schritt führt das zuvor erwähnte Projekt
Checkov
eine statische Codeanalyse für die Terraform-Beispielkonfiguration aus.- bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory) displayName: Checkov Static Code Analysis
Die wichtigsten Punkte:
- Dieses Skript ist dafür verantwortlich, Checkov in dem in einem Docker-Container eingebundenen Terraform-Arbeitsbereich auszuführen. Von Microsoft verwaltete Agents sind Docker-fähig. Das Ausführen von Tools in einem Docker-Container ist einfacher, und zudem entfällt die Notwendigkeit, Checkov auf dem Azure-Pipeline-Agent zu installieren.
- Die Variable
$(terraformWorkingDirectory)
wird in der Dateiazure-pipeline.yaml
definiert.
Sehen Sie sich die Zeile Step 2: install Terraform on the Azure Pipelines agent an. Die Terraform Build & Release Tasks-Erweiterung, die Sie zuvor installiert haben, umfasst einen Befehl zum Installieren von Terraform auf dem Agent, der die Azure-Pipeline ausführt. Diese Aufgabe wird in diesem Schritt ausgeführt.
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: $(terraformVersion)
Die wichtigsten Punkte:
- Die zu installierende Terraform-Version wird über eine Azure-Pipelinevariable namens
terraformVersion
angegeben und in der Dateiazure-pipeline.yaml
definiert.
- Die zu installierende Terraform-Version wird über eine Azure-Pipelinevariable namens
Sehen Sie sich die Zeile Step 3: run Terraform init to initialize the workspace an. Nachdem Terraform auf dem Agent installiert wurde, kann das Terraform-Verzeichnis initialisiert werden.
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform init' inputs: command: init workingDirectory: $(terraformWorkingDirectory)
Die wichtigsten Punkte:
- Die Eingabe
command
gibt an, welcher Terraform-Befehl ausgeführt werden soll. - Die Eingabe
workingDirectory
gibt den Pfad des Terraform-Verzeichnisses an. - Die Variable
$(terraformWorkingDirectory)
wird in der Dateiazure-pipeline.yaml
definiert.
- Die Eingabe
Sehen Sie sich die Zeile Step 4: run Terraform validate to validate HCL syntax an. Nachdem das Projektverzeichnis initialisiert wurde, wird
terraform validate
ausgeführt, um die Konfiguration auf dem Server zu überprüfen.- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform validate' inputs: command: validate workingDirectory: $(terraformWorkingDirectory)
Sehen Sie sich die Zeile Step 5: run Terraform plan to validate HCL syntax an. Wie zuvor erläutert, wird der Ausführungsplan generiert, um vor der Bereitstellung zu überprüfen, ob die Terraform-Konfiguration gültig ist.
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform plan' inputs: command: plan workingDirectory: $(terraformWorkingDirectory) environmentServiceName: $(serviceConnection) commandOptions: -var location=$(azureLocation)
Die wichtigsten Punkte:
- Die Eingabe
environmentServiceName
bezieht sich auf den Namen der Azure-Dienstverbindung, die Sie im Abschnitt Konfigurieren Ihrer Umgebung erstellt haben. Die Verbindung ermöglicht Terraform den Zugriff auf Ihr Azure-Abonnement. - Die Eingabe
commandOptions
wird verwendet, um Argumente an den Terraform-Befehl zu übergeben. In diesem Fall wird ein Speicherort angegeben. Die Variable$(azureLocation)
wird zuvor in der YAML-Datei definiert.
- Die Eingabe
Importieren der Pipeline in Azure DevOps
Öffnen Sie Ihr Azure DevOps-Projekt, und wechseln Sie zum Abschnitt „Azure Pipelines“.
Wählen Sie die Schaltfläche Pipeline erstellen aus.
Wählen Sie unter Wo befindet sich Ihr Code? die Option GitHub (YAML) aus.
An diesem Punkt müssen Sie Azure DevOps möglicherweise für den Zugriff auf Ihre Organisation autorisieren. Weitere Informationen zu diesem Thema finden Sie im Artikel zum Erstellen von GitHub-Repositorys.
Wählen Sie in der Liste der Repositorys den Fork des Repositorys aus, den Sie in Ihrer GitHub-Organisation erstellt haben.
Wählen Sie im Schritt Pipeline konfigurieren die Option zum Verwenden einer vorhandenen Azure Pipelines-YAML-Datei aus.
Wenn die Seite Vorhandene YAML-Datei auswählen angezeigt wird, geben Sie den Branch
master
an, und geben Sie den Pfad zur YAML-Pipeline ein:samples/integration-testing/src/azure-pipeline.yaml
.Wählen Sie Weiter aus, um die Azure-YAML-Pipeline aus GitHub zu laden.
Wenn die Seite Pipeline-YAML überprüfen angezeigt wird, wählen Sie Ausführen aus, um die Pipeline zu erstellen und erstmals manuell auszulösen.
Überprüfen der Ergebnisse
Sie können die Pipeline manuell über die Azure DevOps-Benutzeroberfläche ausführen. In diesem Artikel geht es jedoch um die Automatisierung von Continuous Integration. Testen Sie den Prozess, indem Sie eine Änderung am Ordner samples/integration-testing/src
Ihres geforkten Repositorys vornehmen. Die Änderung löst automatisch eine neue Pipeline in dem Branch aus, in den Sie den Code pushen.
Nachdem Sie diesen Schritt ausgeführt haben, zeigen Sie die Details in Azure DevOps an, um sicherzustellen, dass alles korrekt ausgeführt wurde.
Problembehandlung für Terraform in Azure
Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure
Nächste Schritte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für