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.

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.

  1. Navigieren Sie im Beispielverzeichnis zum Verzeichnis src.

  2. Führen Sie terraform init aus, um das Arbeitsverzeichnis zu initialisieren.

    terraform init
    
  3. 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.
  4. Bearbeiten Sie die main.tf-Datei.

  5. Fügen Sie in Zeile 5 einen Tippfehler ein, durch den die Syntax ungültig wird. Ersetzen Sie beispielsweise var.location durch var.loaction.

  6. Speichern Sie die Datei .

  7. 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.

  1. Navigieren Sie in Ihrem bevorzugten Editor zum lokalen Klon des Terraform-Beispielprojekts auf GitHub.

  2. Öffnen Sie die Datei samples/integration-testing/src/azure-pipeline.yaml .

  3. Scrollen Sie nach unten zum Abschnitt steps. Dort sehen Sie die Standardschritte zum Ausführen verschiedener Installations- und Prüfungsroutinen.

  4. 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 Datei azure-pipeline.yaml definiert.
  5. 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 Datei azure-pipeline.yaml definiert.
  6. 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 Datei azure-pipeline.yaml definiert.
  7. 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)
    
  8. 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.

Importieren der Pipeline in Azure DevOps

  1. Öffnen Sie Ihr Azure DevOps-Projekt, und wechseln Sie zum Abschnitt „Azure Pipelines“.

  2. Wählen Sie die Schaltfläche Pipeline erstellen aus.

  3. Wählen Sie unter Wo befindet sich Ihr Code? die Option GitHub (YAML) aus.

    Wo befindet sich Ihr Code?

  4. 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.

  5. Wählen Sie in der Liste der Repositorys den Fork des Repositorys aus, den Sie in Ihrer GitHub-Organisation erstellt haben.

  6. Wählen Sie im Schritt Pipeline konfigurieren die Option zum Verwenden einer vorhandenen Azure Pipelines-YAML-Datei aus.

    Vorhandene YAML-Pipeline

  7. 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.

    Auswählen einer vorhandenen YAML-Pipeline

  8. Wählen Sie Weiter aus, um die Azure-YAML-Pipeline aus GitHub zu laden.

  9. 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.

    Ausführen der Azure-Pipeline

Ü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.

Über GitHub ausgeführte Pipeline

Nachdem Sie diesen Schritt ausgeführt haben, zeigen Sie die Details in Azure DevOps an, um sicherzustellen, dass alles korrekt ausgeführt wurde.

Azure DevOps-Pipeline mit grünem Status

Problembehandlung für Terraform in Azure

Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure

Nächste Schritte