Implementieren von Integrationstests für Terraform-Projekte in Azure
Terraform ermöglicht die Definition, Vorschau und Bereitstellung der Cloudinfrastruktur. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter ( z. B. Azure ) und die Elemente angeben, aus denen Ihre Cloudinfrastruktur besteht. Nachdem Sie Ihre Konfigurationsdateien erstellt haben, erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau ihrer Infrastrukturänderungen anzeigen können, bevor sie bereitgestellt werden. Nachdem Sie die Änderungen überprüft haben, wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.
Integrationstests überprüfen, ob eine neu eingeführte Codeänderung den vorhandenen Code nicht unterbricht. In DevOps bezieht sich die fortlaufende Integration (CI) auf einen Prozess, der das gesamte System erstellt, wenn die Codebasis geändert wird – z. B. jemand, der eine 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
- Führen Sie terraform plan aus, um sicherzustellen, dass die Konfiguration wie erwartet funktioniert.
In diesem Artikel erfahren Sie, wie Sie:
- Lernen Sie die Grundlagen von Integrationstests für Terraform-Projekte kennen.
- Verwenden Sie Azure DevOps, um eine fortlaufende Integrationspipeline zu konfigurieren.
- Führen Sie statische Codeanalyse für Terraform-Code aus.
- Führen Sie
terraform validate
aus, 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 - Verwenden Sie eine Azure-Pipeline, um die kontinuierliche Integration zu automatisieren.
1. Konfigurieren Ihrer Umgebung
- Azure-Abonnement: Wenn Sie nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.
Terraform konfigurieren: Wenn Sie dies noch nicht getan haben, konfigurieren Sie Terraform mit einer der folgenden Optionen:
Azure DevOps-Organisation und -Projekt: Falls Sie keine haben, erstellen Sie eine Azure DevOps-Organisation.
Erweiterung der Build- und Release-Aufgaben von Terraform: Installieren der Erweiterung der Build- und Release-Aufgaben von Terraform in Ihrer Azure DevOps-Organisation.
Azure DevOps den Zugriff auf Ihr Azure-Abonnement gewähren: Erstellen Sie eine Azure-Dienstverbindung namens
terraform-basic-testing-azure-connection
, damit Azure-Pipelines eine Verbindung mit Ihren Azure-Abonnements herstellen können.Beispielcode und Ressourcen: Laden Sie das Integrationstestprojektvon 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. Dieses Befehlshauptziel ist die Ü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
Wichtige Punkte:
- Es wird eine Meldung angezeigt, die angibt, dass die Terraform-Konfiguration gültig ist.
Bearbeiten Sie die
main.tf
Datei.Fügen Sie in Zeile 5 einen Tippfehler ein, der die Syntax ungültig macht. Ersetzen Sie z. B.
var.location
durchvar.loaction
Speichern Sie die Datei.
Führen Sie die Überprüfung erneut aus.
terraform validate
Wichtige Punkte:
- Eine Fehlermeldung wird angezeigt, die die Zeile des fehlerhaften Codes und eine Beschreibung des Fehlers angibt.
Wie Sie sehen können, 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. Außerdem sollte diese Überprüfungsstufe Teil Ihrer kontinuierlichen Integrationspipeline sein. Weiter unten in diesem Artikel erfahren Sie, wie Sie eine Azure-Pipeline konfigurieren, umautomatisch zu überprüfen.
3. Überprüfen der Terraform-Konfiguration
Im vorherigen Abschnitt haben Sie erfahren, wie Sie eine Terraform-Konfiguration überprüfen. Diese Testebene war für die Syntax spezifisch. Dieser Test berücksichtigte nicht, was bereits in Azure bereitgestellt werden könnte.
Terraform ist eine deklarative Sprache, was bedeutet, dass Sie das gewünschte Endergebnis deklarieren. Angenommen, Sie haben 10 virtuelle Computer in einer Ressourcengruppe. Anschließend erstellen Sie eine Terraform-Datei, die drei virtuelle Computer definiert. Wenn Sie diesen Plan anwenden, wird die Gesamtanzahl nicht auf 13 erhöht. Stattdessen löscht Terraform sieben der virtuellen Maschinen, damit Sie mit drei enden. Wenn Sie terraform plan
ausführen, können Sie die potenziellen Ergebnisse der Anwendung eines Ausführungsplans bestätigen, um Überraschungen zu vermeiden.
Um den Terraform-Ausführungsplan zu generieren, führen Sie terraform plan aus. Mit diesem Befehl wird eine Verbindung mit dem Azure-Zielabonnement hergestellt, um zu überprüfen, welcher Teil der Konfiguration bereits bereitgestellt wurde. Terraform bestimmt dann die notwendigen Änderungen, um die in der Terraform-Datei angegebenen Anforderungen zu erfüllen. In dieser Phase stellt Terraform nichts bereit. Sie erfahren, was passiert, wenn Sie den Plan anwenden.
Wenn Sie dem Artikel folgen und die Schritte im vorherigen Abschnitt ausgeführt haben, führen Sie 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 eignet sich gut in Einzelbenutzerszenarien. 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 auszuführen und einen Remotecomputer als Ziel festzulegen. 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 kann hilfreich sein, um Probleme wie Sicherheitsprobleme und Compliance-Inkonsistenzen zu erkennen.
Die folgenden Tools bieten statische Analysen für Terraform-Dateien:
Statische Analysen werden häufig als Teil einer kontinuierlichen Integrationspipeline ausgeführt. Für diese Tests ist die Erstellung eines Ausführungsplans oder einer Bereitstellung nicht erforderlich. Daher werden sie schneller als andere Tests ausgeführt und im Allgemeinen zuerst im kontinuierlichen Integrationsprozess ausgeführt.
5. Automatisieren von Integrationstests mit Azure Pipeline
Die kontinuierliche Integration umfasst das Testen eines gesamten Systems, wenn eine Änderung eingeführt wird. In diesem Abschnitt wird eine Azure Pipeline-Konfiguration zum Implementieren der kontinuierlichen Integration angezeigt.
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
Wichtige Punkte:
- Dieses Skript ist für die Ausführung von Checkov im Terraform-Arbeitsbereich verantwortlich, der in einem Docker-Container bereitgestellt ist. Von Microsoft verwaltete Agents sind Docker-fähig. Das Ausführen von Tools in einem Docker-Container ist einfacher und entfernt die Notwendigkeit, Checkov im Azure Pipeline-Agent zu installieren.
- Die
$(terraformWorkingDirectory)
Variable wird in derazure-pipeline.yaml
Datei definiert.
Sehen Sie sich die Zeile Step 2: install Terraform on the Azure Pipelines agent an. Die Terraform Build & Release Task Extension, die Sie zuvor installiert haben, verfügt über 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)
Wichtige Punkte:
- Die zu installierende Version von Terraform wird über eine Azure Pipeline-Variable namens
terraformVersion
angegeben und in derazure-pipeline.yaml
Datei definiert.
- Die zu installierende Version von Terraform wird über eine Azure Pipeline-Variable namens
Überprüfen Sie die Zeile, die die folgende Anweisung enthält: Schritt 3: Führen Sie Terraform init aus, um den Arbeitsbereichzu initialisieren. Nachdem Terraform auf dem Agenten installiert ist, 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)
Wichtige Punkte:
- Die Eingabe
command
gibt an, welcher Terraform-Befehl ausgeführt werden soll. - Die Eingabe
workingDirectory
gibt den Pfad des Terraform-Verzeichnisses an. - Die
$(terraformWorkingDirectory)
Variable wird in derazure-pipeline.yaml
Datei definiert.
- Die Eingabe
Sehen Sie sich die Zeile Step 4: run Terraform validate to validate HCL syntax an. Sobald 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)
Wichtige Punkte:
- Die
environmentServiceName
Eingabe bezieht sich auf den Namen der Azure-Dienstverbindung, die in Konfigurieren Ihrer Umgebungerstellt wurde. 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 Ort angegeben. Die$(azureLocation)
Variable wird weiter oben in der YAML-Datei definiert.
- Die
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.
Zu diesem Zeitpunkt müssen Sie Möglicherweise Azure DevOps für den Zugriff auf Ihre Organisation autorisieren. Weitere Informationen zu diesem Thema finden Sie im Artikel Erstellen von GitHub-Repositorys.
Wählen Sie in der Verzeichnisliste den Fork des Repositorys aus, das 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 Continue aus, um die Azure YAML-Pipeline von 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. Der Punkt des Artikels besteht jedoch darin, eine automatisierte kontinuierliche Integration zu zeigen. 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.
läuft
Nachdem Sie diesen Schritt ausgeführt haben, greifen Sie auf die Details in Azure DevOps zu, um sicherzustellen, dass alles ordnungsgemäß ausgeführt wurde.
Problembehebung für Terraform auf Azure
Behebung häufiger Probleme bei der Verwendung von Terraform in Azure