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 validateuit om Terraform-configuratiebestanden op de lokale computer te valideren.- Voer
terraform planuit 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.
Terraform configureren: Als u dit nog niet hebt gedaan, configureert u Terraform met een van de volgende opties:
Azure DevOps-organisatie en -project:als u er nog geen hebt, maakt u een Azure DevOps-organisatie.
Terraform Build Extensie voor releasetaken:installeer de Terraform-extensie voor build-/releasetaken in uw Azure DevOps-organisatie.
Azure DevOps toegang verlenentot uw Azure-abonnement: maak een Azure-serviceverbinding met de naam zodat Azure Pipelines verbinding kan maken met uw Azure-abonnementen
Voorbeeldcode en resources: Download met behulp van het hulpprogramma DownGit van GitHub project integration-testing en uit te voeren in een nieuwe map om de voorbeeldcode op te nemen. Deze map wordt de voorbeeldmap genoemd.
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.
Navigeer in de voorbeeldmap naar de
srcmap .Voer terraform init uit om de werkmap te initialiseren.
terraform initVoer terraform validate uit om de syntaxis van de configuratiebestanden te valideren.
terraform validateBelangrijkste punten:
- U ziet een bericht dat aangeeft dat de Terraform-configuratie geldig is.
Het bestand
main.tfbewerken.Voeg op regel 5 een typfout in die de syntaxis ongeldig maakt. Vervang bijvoorbeeld
var.locationdoorvar.loactionSla het bestand op.
Voer de validatie opnieuw uit.
terraform validateBelangrijkste 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.
Blader met de editor van uw keuze naar de lokale kloon van het Terraform-voorbeeldproject op GitHub.
Open het bestand
samples/integration-testing/src/azure-pipeline.yaml.Schuif omlaag naar de sectie met stappen waar u een standaardset stappen ziet die worden gebruikt om verschillende installatie- en validatieroutines uit te voeren.
Bekijk de regel met de tekst Stap 1: de Statische codeanalyse van Checkov uitvoeren. In deze stap voert het
Checkoveerder genoemde project een statische codeanalyse uit op de Terraform-voorbeeldconfiguratie.- bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory) displayName: Checkov Static Code AnalysisBelangrijkste 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 bestandazure-pipeline.yaml.
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
terraformVersionen gedefinieerd in hetazure-pipeline.yamlbestand.
- De versie van Terraform die moet worden geïnstalleerd, wordt opgegeven via een Azure Pipeline-variabele met de naam
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
commandinvoer geeft aan welke Terraform-opdracht moet worden uitgevoerd. - De
workingDirectoryinvoer geeft het pad van de Map Terraform aan. - De
$(terraformWorkingDirectory)variabele wordt gedefinieerd in het bestandazure-pipeline.yaml.
- De
Controleer de regel met de tekst Stap 4: Terraform valideren uitvoeren om de HCL-syntaxis te valideren. Zodra de projectmap is initialiseren,
terraform validatewordt 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)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
environmentServiceNameinvoer verwijst naar de naam van de Azure-serviceverbinding die is gemaakt inenvironmentServiceNameDankzij de verbinding heeft Terraform toegang tot uw Azure-abonnement. - De
commandOptionsinvoer 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
De pijplijn importeren in Azure DevOps
Open uw Azure DevOps-project en ga naar de sectie Azure Pipelines.
Selecteer de knop Pijplijn maken.
Selecteer voor de optie Waar is uw code?GitHub (YAML).

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.
Selecteer in de lijst met opslagplaatsen de fork van de opslagplaats die u hebt gemaakt in GitHub organisatie.
Kies in de stap Uw pijplijn configureren om te beginnen met een bestaande YAML-pijplijn.

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.
Selecteer Doorgaan om de Azure YAML-pijplijn te laden vanuit GitHub.
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.

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.

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

Problemen met Terraform in Azure oplossen
Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen