Integratietests implementeren voor Terraform-projecten in Azure
Terraform- maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Terraform maakt u configuratiebestanden met behulp van HCL-syntaxis. Met de HCL-syntaxis kunt u de cloudprovider opgeven, zoals Azure, en de elementen waaruit uw cloudinfrastructuur bestaat. Nadat u uw configuratiebestanden hebt gemaakt, maakt u een uitvoeringsplan waarmee u een voorbeeld van uw infrastructuurwijzigingen kunt bekijken voordat deze worden geïmplementeerd. Zodra u de wijzigingen hebt gecontroleerd, past u het uitvoeringsplan toe om de infrastructuur te implementeren.
Integratietests valideren dat een nieuw geïntroduceerde codewijziging de bestaande code niet onderbreekt. In DevOps verwijst continue integratie (CI) naar een proces waarmee het hele systeem wordt gebouwd wanneer de codebasis wordt gewijzigd, zoals iemand die een pull-aanvraag wil samenvoegen in een Git-opslagplaats. 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 valideren.
- Voer terraform-plan uit om ervoor te zorgen dat de configuratie werkt zoals verwacht.
In dit artikel leert u het volgende:
- Meer informatie over de basisbeginselen van integratietests voor Terraform-projecten.
- Gebruik Azure DevOps om een pijplijn voor continue integratie te configureren.
- Voer statische codeanalyse uit op Terraform-code.
- Voer
terraform validate
uit om Terraform-configuratiebestanden op de lokale computer te valideren. - Voer
terraform plan
uit om te valideren dat Terraform-configuratiebestanden vanuit extern dienstenperspectief. - Gebruik een Azure Pipeline om continue integratie te automatiseren.
1. Uw omgeving configureren
- Azure-abonnement: als u nog geen Azure-abonnement hebt, maakt u een gratis account 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, een Azure DevOps-organisatie maken.
Extensie Terraform Build & Release Tasks: Installeer de extensie voor Terraform-build-/releasetaken in uw Azure DevOps-organisatie.
Azure DevOps toegang verlenen tot uw Azure-abonnement: maak een Azure-serviceverbinding met de naam
terraform-basic-testing-azure-connection
zodat Azure Pipelines verbinding kan maken met uw Azure-abonnementenVoorbeeldcode en resources: Downloaden van GitHub het project voor integratietests. De map waarin u het voorbeeld downloadt, wordt de voorbeeldmapgenoemd.
2. Een lokale Terraform-configuratie valideren
De terraform validate-opdracht wordt uitgevoerd via de opdrachtregel in de map die uw Terraform-bestanden bevat. Met deze opdrachten wordt de syntaxis gecontroleerd.
Navigeer in de voorbeeldmap naar de map
src
.Voer terraform init uit om de werkmap te initialiseren.
terraform init
Voer terraform validate uit om de syntaxis van de configuratiebestanden te valideren.
terraform validate
belangrijke punten:
- U ziet een bericht dat aangeeft dat de Terraform-configuratie geldig is.
Bewerk het
main.tf
-bestand.Voeg op regel 5 een typefout in die de syntaxis ongeldig maakt. Vervang bijvoorbeeld
var.location
doorvar.loaction
Sla het bestand op.
Voer de validatie opnieuw uit.
terraform validate
belangrijke punten:
- U ziet een foutbericht dat de coderegel in de fout aangeeft 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 terraform validate
uit te voeren op uw Terraform-bestanden voordat u ze naar uw versiebeheersysteem pusht. Dit validatieniveau moet ook deel uitmaken van uw pijplijn voor continue integratie. Verderop in dit artikel verkennen we hoe u een Azure-pijplijn kunt configureren omautomatisch te valideren.
3. Terraform-configuratie valideren
In de vorige sectie hebt u gezien hoe u een Terraform-configuratie kunt valideren. Dat testniveau was specifiek voor de syntaxis. Bij deze test is niet rekening gehouden met wat er mogelijk al in Azure is geïmplementeerd.
Terraform is een declaratieve taal betekent dat u declareert wat u wilt als eindresultaat. Stel dat u 10 virtuele machines in een resourcegroep hebt. Vervolgens maakt u een Terraform-bestand dat drie virtuele machines definieert. Als u dit plan toepast, wordt het totaalaantal niet verhoogd naar 13. In plaats daarvan verwijdert Terraform zeven van de virtuele machines, zodat u met drie eindigt. Door terraform plan
uit te voeren, kunt u de mogelijke resultaten van het toepassen van een uitvoeringsplan bevestigen om verrassingen te voorkomen.
Als u het Terraform-uitvoeringsplan wilt genereren, voert u terraform-plan uit. 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 zijn vermeld in het Terraform-bestand. In deze fase implementeert Terraform niets. Het vertelt u wat er gebeurt als u het plan toepast.
Als u het artikel volgt en u de stappen in de vorige sectie hebt uitgevoerd, voert u de opdracht terraform plan
uit:
terraform plan
Nadat terraform plan
is uitgevoerd, wordt in Terraform het mogelijke resultaat weergegeven van het toepassen van het uitvoeringsplan. De uitvoer geeft de Azure-resources aan die worden toegevoegd, gewijzigd en vernietigd.
Terraform slaat standaard de status op in dezelfde lokale map als het Terraform-bestand. Dit patroon werkt goed in scenario's met één gebruiker. Wanneer meerdere personen echter 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 gegevensarchief (zoals Azure Storage). In dit scenario kan het problematisch zijn om terraform plan
uit te voeren op een lokale computer en een externe computer te targeten. Als gevolg hiervan kan het zinvol zijn om deze validatiestap te automatiseren als onderdeel van uw continue integratiepijplijn.
4. Statische codeanalyse uitvoeren
Statische codeanalyse kan rechtstreeks op de Terraform-configuratiecode worden uitgevoerd zonder deze uit te voeren. Deze analyse kan handig zijn om problemen te detecteren, zoals beveiligingsproblemen en inconsistentie van naleving.
De volgende hulpprogramma's bieden statische analyse voor Terraform-bestanden:
- Checkov
- Terrascan
- tfsec-
- Deepsource
Statische analyse wordt vaak uitgevoerd als onderdeel van een pijplijn voor continue integratie. Voor deze tests is het maken van een uitvoeringsplan of implementatie niet vereist. Als gevolg hiervan worden ze sneller uitgevoerd dan andere tests en worden ze meestal eerst uitgevoerd in het proces voor continue integratie.
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 uw editor naar keuze naar de lokale kloon van het Terraform-voorbeeldproject op GitHub.
Open het
samples/integration-testing/src/azure-pipeline.yaml
-bestand.Schuif omlaag naar de stappen sectie waarin u een standaardset stappen ziet die worden gebruikt voor het uitvoeren van verschillende installatie- en validatieroutines.
Controleer de regel die luidt: Stap 1: voer de Checkov Static Code Analysisuit. 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
belangrijke punten:
- Dit script is verantwoordelijk voor het uitvoeren van Checkov in de Terraform-werkruimte die is gekoppeld in een Docker-container. Door Microsoft beheerde agents zijn Docker ingeschakeld. Het uitvoeren van hulpprogramma's in een Docker-container is eenvoudiger en verwijdert de noodzaak om Checkov te installeren op de Azure Pipeline-agent.
- De variabele
$(terraformWorkingDirectory)
wordt gedefinieerd in hetazure-pipeline.yaml
-bestand.
Controleer de regel waarin staat, Stap 2: Terraform installeren op de Azure Pipelines-agent. De Terraform Build & Release Task Extension die u eerder hebt geïnstalleerd, heeft een opdracht om Terraform te installeren op de agent waarop de Azure Pipeline wordt uitgevoerd. Deze taak wordt in deze stap uitgevoerd.
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: $(terraformVersion)
belangrijke punten:
- De te installeren versie van Terraform wordt opgegeven via een Azure Pipeline-variabele met de naam
terraformVersion
en gedefinieerd in hetazure-pipeline.yaml
-bestand.
- De te installeren versie van Terraform wordt opgegeven via een Azure Pipeline-variabele met de naam
Controleer de regel die wordt gelezen stap 3: Voer Terraform init uit om de werkruimtete initialiseren. Nu Terraform geïnstalleerd is op de agent, kan de Terraform-map worden geïnitialiseerd.
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform init' inputs: command: init workingDirectory: $(terraformWorkingDirectory)
belangrijke punten:
- De
command
-invoer geeft aan welke Terraform-opdracht moet worden uitgevoerd. - De
workingDirectory
-invoer geeft het pad van de Terraform-directory aan. - De variabele
$(terraformWorkingDirectory)
wordt gedefinieerd in hetazure-pipeline.yaml
-bestand.
- De
Controleer de regel die wordt gelezen stap 4: Voer Terraform-validatie uit om de HCL-syntaxis te valideren. Zodra de projectmap is geïnitialiseerd, wordt
terraform validate
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)
Controleer de regel die luidt Stap 5: voer Terraform plan uit 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)
belangrijke punten:
- De
environmentServiceName
-invoer verwijst naar de naam van de Azure-serviceverbinding die is gemaakt in Uw omgeving configureren. Met 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
De pijplijn importeren in Azure DevOps
Open uw Azure DevOps-project en ga naar de sectie Azure Pipelines.
Selecteer knop Pijplijn maken.
Voor de Waar is uw code? optie selecteert u GitHub -(YAML).
Op dit moment moet u Azure DevOps mogelijk autoriseren voor toegang tot uw organisatie. Zie het artikel GitHub-opslagplaatsen bouwenvoor meer informatie over dit onderwerp.
Selecteer in de lijst met opslagplaatsen de fork van de opslagplaats die u in uw GitHub-organisatie hebt gemaakt.
Kies in de De pijplijn configureren stap om te beginnen met een bestaande YAML-pijplijn.
Wanneer de pagina Bestaande YAML-pijplijn selecteren wordt weergegeven, geeft u de vertakking
master
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 vanuit GitHub te laden.
Wanneer de pagina Controleer uw pijplijn YAML wordt weergegeven, selecteert u Uitvoeren om de pijplijn voor het eerst te creëren en handmatig te activeren.
uit
De resultaten controleren
U kunt de pijplijn handmatig uitvoeren vanuit de Azure DevOps-gebruikersinterface. Het punt van het artikel is echter om geautomatiseerde continue integratie weer te geven. Test het proces door een wijziging door te voeren in de map samples/integration-testing/src
van uw geforkte opslagplaats. De wijziging activeert automatisch een nieuwe pijplijn op de branch waarop u code pusht.
Zodra u deze stap hebt uitgevoerd, opent u de details in Azure DevOps om ervoor te zorgen dat alles correct is uitgevoerd.
Problemen met Terraform in Azure oplossen
Veelvoorkomende problemen oplossen bij het gebruik van Terraform in Azure