Integratietests implementeren voor Terraform-projecten in Azure

Integratietests valideren dat een nieuw geïntroduceerde codewijziging de bestaande code niet verbreekt. In DevOps verwijst continue integratie (CI) naar een proces dat het hele systeem bouwt wanneer de codebasis wordt gewijzigd, zoals iemand die een pr wil samenvoegen in een Git-repo. De volgende lijst bevat veelvoorkomende voorbeelden van integratietests:

  • Hulpprogramma's voor statische codeanalyse, zoals lint en indeling.
  • Voer terraform validate uit om de syntaxis van het configuratiebestand te controleren.
  • Voer terraform plan uit om ervoor te zorgen dat de configuratie werkt zoals verwacht.

In dit artikel leert u het volgende:

  • Leer de basisbeginselen van integratietests voor Terraform-projecten.
  • Gebruik Azure DevOps om een pijplijn voor continue integratie te configureren.
  • Statische codeanalyse uitvoeren op Terraform-code.
  • Voer terraform validate uit om Terraform-configuratiebestanden op de lokale computer te valideren.
  • Voer terraform plan uit om terraform-configuratiebestanden te valideren vanuit het perspectief van externe services.
  • Gebruik een Azure-pijplijn om continue integratie te automatiseren.

1. Uw omgeving configureren

  • Azure-abonnement: Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.

2. Een lokale Terraform-configuratie valideren

De opdracht terraform validate wordt uitgevoerd vanaf de opdrachtregel in de map met uw Terraform-bestanden. Het belangrijkste doel van deze opdrachten is het valideren van de syntaxis.

  1. Navigeer in de voorbeeldmap naar de src map .

  2. Voer terraform init uit om de werkmap te initialiseren.

    terraform init
    
  3. Voer terraform validate uit om de syntaxis van de configuratiebestanden te valideren.

    terraform validate
    

    Belangrijkste punten:

    • U ziet een bericht dat aangeeft dat de Terraform-configuratie geldig is.
  4. Het bestand main.tf bewerken.

  5. Voeg op regel 5 een typfout in die de syntaxis ongeldig maakt. Vervang bijvoorbeeld var.location door var.loaction

  6. Sla het bestand op.

  7. Voer de validatie opnieuw uit.

    terraform validate
    

    Belangrijkste punten:

    • U ziet een foutbericht met de foutregel en een beschrijving van de fout.

Zoals u ziet, heeft Terraform een probleem gedetecteerd in de syntaxis van de configuratiecode. Dit probleem voorkomt dat de configuratie wordt geïmplementeerd.

Het is een goede gewoonte om altijd uit te voeren op uw terraform validate Terraform-bestanden voordat u ze naar uw versiebeheersysteem pusht. Dit validatieniveau moet ook deel uitmaken van uw pijplijn voor continue integratie. Verder in dit artikel wordt beschreven hoe u een Azure-pijplijn configureert om automatisch te valideren.

3. Terraform-configuratie valideren

In de vorige sectie hebt u gezien hoe u een Terraform-configuratie valideert. Dat testniveau was specifiek voor de syntaxis. Bij deze test is geen rekening gehouden met wat er mogelijk al in Azure is geïmplementeerd.

Terraform is een declaratieve taal die betekent dat u declareren wat u wilt als een eindresultaat. Stel dat u 10 virtuele machines in een resourcegroep hebt. Vervolgens maakt u een Terraform-bestand waarin drie virtuele machines worden aangeduid. Door dit plan toe te passen, wordt het totale aantal niet verhoogd naar 13. In plaats daarvan verwijdert Terraform zeven van de virtuele machines, zodat u eindigt met drie. Als terraform plan u wordt uitgevoerd, kunt u de mogelijke resultaten van het toepassen van een uitvoeringsplan bevestigen om verrassingen te voorkomen.

Als u het Terraform-uitvoeringsplan wilt genereren, moet u terraform plan uitvoeren. Met deze opdracht maakt u verbinding met het Azure-doelabonnement om te controleren welk deel van de configuratie al is geïmplementeerd. Terraform bepaalt vervolgens de benodigde wijzigingen om te voldoen aan de vereisten die worden vermeld in het Terraform-bestand. In deze fase implementeert Terraform niets. Het vertelt u wat er gebeurt als u het plan gaat toepassen.

Als u het artikel volgt en u de stappen in de vorige sectie hebt uitgevoerd, voer dan de opdracht terraform plan uit:

terraform plan

Na het terraform plan uitvoeren van geeft Terraform het mogelijke resultaat weer van het toepassen van het uitvoeringsplan. De uitvoer geeft de Azure-resources aan die worden toegevoegd, gewijzigd en vernietigd.

Terraform slaat de status standaard op in dezelfde lokale map als het Terraform-bestand. Dit patroon werkt goed in scenario's met één gebruiker. Wanneer er echter meerdere personen aan dezelfde Azure-resources werken, kunnen lokale statusbestanden niet meer worden gesynchroniseerd. Om dit probleem op te lossen, ondersteunt Terraform het schrijven van statusbestanden naar een extern gegevensopslag (zoals Azure Storage). In dit scenario kan het problematisch zijn om uit te voeren terraform plan op een lokale computer en een externe computer als doel te gebruiken. Als gevolg hiervan kan het zinvol zijn om deze validatiestap te automatiseren als onderdeel van uw pijplijn voor continue integratie.

4. Statische codeanalyse uitvoeren

Statische codeanalyse kan rechtstreeks op de Terraform-configuratiecode worden uitgevoerd zonder deze uit te voeren. Deze analyse kan nuttig zijn voor het detecteren van problemen zoals beveiligingsproblemen en inconsistentie in de naleving.

De volgende hulpprogramma's bieden statische analyse voor Terraform-bestanden:

Statische analyse wordt vaak uitgevoerd als onderdeel van een pijplijn voor continue integratie. Voor deze tests is het niet nodig om een uitvoeringsplan of implementatie te maken. Als gevolg hiervan worden ze sneller uitgevoerd dan andere tests en worden ze over het algemeen als eerste uitgevoerd in het continue integratieproces.

5. Integratietests automatiseren met behulp van Azure Pipeline

Continue integratie omvat het testen van een volledig systeem wanneer een wijziging wordt geïntroduceerd. In deze sectie ziet u een Azure Pipeline-configuratie die wordt gebruikt voor het implementeren van continue integratie.

  1. Blader met de editor van uw keuze naar de lokale kloon van het Terraform-voorbeeldproject op GitHub.

  2. Open het bestand samples/integration-testing/src/azure-pipeline.yaml.

  3. Schuif omlaag naar de sectie met stappen waar u een standaardset stappen ziet die worden gebruikt om verschillende installatie- en validatieroutines uit te voeren.

  4. Bekijk de regel met de tekst Stap 1: de Statische codeanalyse van Checkov uitvoeren. In deze stap voert het Checkov eerder genoemde project een statische codeanalyse uit op de Terraform-voorbeeldconfiguratie.

    - bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory)
      displayName: Checkov Static Code Analysis
    

    Belangrijkste punten:

    • Dit script is verantwoordelijk voor het uitvoeren van Checkov in de Terraform-werkruimte die is bevestigd in een Docker-container. Door Microsoft beheerde agents zijn ingeschakeld voor Docker. Het uitvoeren van hulpprogramma's in een Docker-container is eenvoudiger en u hoeft Checkov niet meer te installeren op de Azure Pipeline-agent.
    • De $(terraformWorkingDirectory) variabele wordt gedefinieerd in het bestand azure-pipeline.yaml .
  5. Bekijk de regel met de tekst Stap 2: Terraform installeren op de Azure Pipelines-agent. De Terraform Build Release Task-extensie die u eerder hebt geïnstalleerd, heeft een opdracht voor het installeren van Terraform op de agent met de Azure Pipeline. Deze taak wordt uitgevoerd in deze stap.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0
      displayName: 'Install Terraform'
      inputs:
        terraformVersion: $(terraformVersion)
    

    Belangrijkste punten:

    • De versie van Terraform die moet worden geïnstalleerd, wordt opgegeven via een Azure Pipeline-variabele met de naam terraformVersion en gedefinieerd in het azure-pipeline.yaml bestand.
  6. Bekijk de regel met de tekst Stap 3: Terraform init uitvoeren om de werkruimte te initialiseren. Nu Terraform is geïnstalleerd op de agent, kan de Terraform-map worden initialiseren.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform init'
      inputs:
        command: init
        workingDirectory: $(terraformWorkingDirectory)
    

    Belangrijkste punten:

    • De command invoer geeft aan welke Terraform-opdracht moet worden uitgevoerd.
    • De workingDirectory invoer geeft het pad van de Map Terraform aan.
    • De $(terraformWorkingDirectory) variabele wordt gedefinieerd in het bestand azure-pipeline.yaml .
  7. Controleer de regel met de tekst Stap 4: Terraform valideren uitvoeren om de HCL-syntaxis te valideren. Zodra de projectmap is initialiseren, terraform validate wordt uitgevoerd om de configuratie op de server te valideren.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform validate'
      inputs:
        command: validate
        workingDirectory: $(terraformWorkingDirectory)
    
  8. Bekijk de regel met de tekst Stap 5: Terraform-plan uitvoeren om de HCL-syntaxis te valideren. Zoals eerder is uitgelegd, wordt het uitvoeringsplan gegenereerd om te controleren of de Terraform-configuratie geldig is vóór de implementatie.

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

    Belangrijkste punten:

    • De environmentServiceName invoer verwijst naar de naam van de Azure-serviceverbinding die is gemaakt in environmentServiceName Dankzij de verbinding heeft Terraform toegang tot uw Azure-abonnement.
    • De commandOptions invoer wordt gebruikt om argumenten door te geven aan de Terraform-opdracht. In dit geval wordt een locatie opgegeven. De $(azureLocation) variabele is eerder gedefinieerd in het YAML-bestand.

De pijplijn importeren in Azure DevOps

  1. Open uw Azure DevOps-project en ga naar de sectie Azure Pipelines.

  2. Selecteer de knop Pijplijn maken.

  3. Selecteer voor de optie Waar is uw code?GitHub (YAML).

    Waar is uw code?

  4. Op dit moment moet u Azure DevOps mogelijk machtigen voor toegang tot uw organisatie. Zie het artikel Build GitHub repositories voor meer informatie over dit onderwerp.

  5. Selecteer in de lijst met opslagplaatsen de fork van de opslagplaats die u hebt gemaakt in GitHub organisatie.

  6. Kies in de stap Uw pijplijn configureren om te beginnen met een bestaande YAML-pijplijn.

    Bestaande YAML-pijplijn

  7. Wanneer de pagina Bestaande YAML-pijplijn selecteren wordt weergegeven, geeft u de vertakking op en voert u het pad naar de YAML-pijplijn in: samples/integration-testing/src/azure-pipeline.yaml .

    Bestaande YAML-pijplijn selecteren

  8. Selecteer Doorgaan om de Azure YAML-pijplijn te laden vanuit GitHub.

  9. Wanneer de pagina Uw pijplijn-YAML controleren wordt weergegeven, selecteert u Uitvoeren om de pijplijn voor de eerste keer te maken en handmatig te activeren.

    Azure Pipeline uitvoeren

De resultaten controleren

U kunt de pijplijn handmatig uitvoeren vanuit de Gebruikersinterface van Azure DevOps. Het punt van het artikel is echter om geautomatiseerde continue integratie weer te geven. Test het proces door een wijziging door te brengen in samples/integration-testing/src de map van uw gevorkte opslagplaats. De wijziging activeert automatisch een nieuwe pijplijn in de vertakking waarop u de code pusht.

Pijplijn die wordt uitgevoerd vanuit GitHub

Nadat u deze stap hebt uitgevoerd, krijgt u toegang tot de details in Azure DevOps om ervoor te zorgen dat alles correct is uitgevoerd.

Azure DevOps Green Pipeline

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen

Volgende stappen