Integratietests implementeren voor Terraform-projecten in Azure

Terraform maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Behulp van Terraform maakt u configuratiebestanden met behulp van de 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 ze 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-validatie 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:

  • 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 deze opdracht uit terraform validate om Terraform-configuratiebestanden op de lokale computer te valideren.
  • Voer deze opdracht terraform plan uit om te valideren dat Terraform-configuratiebestanden vanuit het perspectief van externe services.
  • Gebruik een Azure Pipeline om continue integratie te automatiseren.

1. Uw omgeving configureren

  • Azure-abonnement: als u nog geen abonnement op Azure hebt, maakt u een gratis Azure-account aan voordat u begint.
  • Azure DevOps-organisatie en -project: als u er nog geen hebt, maakt u een Azure DevOps-organisatie.

  • Terraform Build & Release Tasks-extensie: Installeer de extensie terraform build/release-taken 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-abonnementen

  • Voorbeeldcode en resources: Download vanuit GitHub het project voor integratietests. De map waarin u het voorbeeld downloadt, wordt de voorbeeldmap genoemd.

2. Een lokale Terraform-configuratie valideren

De terraform-validatieopdracht wordt uitgevoerd vanaf de opdrachtregel in de map met uw Terraform-bestanden. Met deze opdrachten wordt de syntaxis gecontroleerd.

  1. Navigeer in de voorbeeldmap naar de src map.

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

    terraform init
    
  3. Voer terraform-validatie 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 typefout in die de syntaxis ongeldig maakt. Vervang bijvoorbeeld door var.locationvar.loaction

  6. Sla het bestand op.

  7. Voer de validatie opnieuw uit.

    terraform validate
    

    Belangrijkste 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 te worden uitgevoerd terraform validate 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 configureert om automatisch 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 die 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. Als u deze optie uitvoert terraform plan , 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 terraform plan opdracht uit:

terraform plan

Na uitvoering terraform plangeeft 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 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 op een lokale computer uit te voeren terraform plan en een externe computer te targeten. 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 handig zijn om problemen te detecteren, zoals beveiligingsproblemen en inconsistentie van 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 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.

  1. Blader met uw editor naar 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 waarin u een standaardset stappen ziet die worden gebruikt voor het uitvoeren van verschillende installatie- en validatieroutines.

  4. Controleer de regel die wordt gelezen, stap 1: voer de checkov static code-analyse uit. 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 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 $(terraformWorkingDirectory) variabele wordt gedefinieerd in het azure-pipeline.yaml bestand.
  5. Bekijk de regel die wordt gelezen, stap 2: Terraform installeren op de Azure Pipelines-agent. De Terraform Build & Release-taakextensie 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)
    

    Belangrijkste punten:

    • De te installeren versie van Terraform wordt opgegeven via een Azure Pipeline-variabele met de naam terraformVersion en gedefinieerd in het azure-pipeline.yaml bestand.
  6. Bekijk de regel die wordt gelezen, stap 3: voer Terraform init uit om de werkruimte te initialiseren. Nu Terraform is geïnstalleerd 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)
    

    Belangrijkste punten:

    • De command invoer geeft aan welke Terraform-opdracht moet worden uitgevoerd.
    • De workingDirectory invoer geeft het pad van de Terraform-map aan.
    • De $(terraformWorkingDirectory) variabele wordt gedefinieerd in het azure-pipeline.yaml bestand.
  7. Controleer de regel die wordt gelezen, stap 4: Voer Terraform-validatie uit om de HCL-syntaxis te valideren. Zodra de projectmap is geïnitialiseerd, terraform validate wordt deze 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 die wordt gelezen, 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)
    

    Belangrijkste 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 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 GitHub (YAML) voor de optie Waar is uw code?

    Waar is uw code?

  4. Op dit moment moet u Azure DevOps mogelijk autoriseren voor toegang tot uw organisatie. Zie het artikel GitHub-opslagplaatsen bouwen voor meer informatie over dit onderwerp.

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

  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 master 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 vanuit GitHub te laden.

  9. Wanneer de YAML-pagina Uw pijplijn 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 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 samples/integration-testing/src map van uw geforkte opslagplaats. De wijziging activeert automatisch een nieuwe pijplijn op de vertakking waarop u de code pusht.

Pijplijn die wordt uitgevoerd vanuit GitHub

Zodra u deze stap hebt uitgevoerd, opent u 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 oplossen bij het gebruik van Terraform in Azure

Volgende stappen