Implementare test di integrazione per i progetti Terraform in Azure

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

I test di integrazione verificano che una modifica del codice appena introdotta non interrompa il codice esistente. In DevOps l'integrazione continua (CI) si riferisce a un processo che compila l'intero sistema ogni volta che viene modificata la codebase, ad esempio quando un utente vuole unire una richiesta pull in un repository Git. L'elenco seguente contiene esempi comuni di test di integrazione:

  • Strumenti statici di analisi del codice, ad esempio lint e formato.
  • Eseguire terraform validate per verificare la sintassi del file di configurazione.
  • Eseguire terraform plan per verificare se la configurazione funziona come previsto.

In questo articolo vengono illustrate le operazioni seguenti:

  • Ottenere informazioni sui concetti di base dei test di integrazione per i progetti Terraform.
  • Usare Azure DevOps per configurare una pipeline di integrazione continua.
  • Eseguire l'analisi statica del codice nel codice di Terraform.
  • Eseguire terraform validate per convalidare i file di configurazione di Terraform nel computer locale.
  • Eseguire terraform plan per convalidare i file di configurazione di Terraform dal punto di vista dei servizi remoti.
  • Usare una pipeline di Azure per automatizzare l'integrazione continua.

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Organizzazione e progetto di Azure DevOps: se non è disponibile, creare un'organizzazione di Azure DevOps.

  • Estensione Terraform Build & Release Tasks: installare l'estensione delle attività di compilazione/rilascio terraform nell'organizzazione di Azure DevOps.

  • Concedere ad Azure DevOps l'accesso alla sottoscrizione di Azure: creare una connessione al servizio di Azure denominata terraform-basic-testing-azure-connection per consentire ad Azure Pipelines di connettersi alle sottoscrizioni di Azure

  • Codice e risorse di esempio: scaricare da GitHub il progetto di test di integrazione. La directory in cui si scarica l'esempio viene definita directory di esempio.

2. Convalidare una configurazione Terraform locale

Il comando terraform validate viene eseguito dalla riga di comando nella directory contenente i file di Terraform. L'obiettivo principale di questo comando consiste nel convalidare la sintassi.

  1. All'interno della directory di esempio passare alla src directory .

  2. Eseguire terraform init per inizializzare la directory di lavoro.

    terraform init
    
  3. Eseguire terraform validate per convalidare la sintassi dei file di configurazione.

    terraform validate
    

    Punti principali:

    • Viene visualizzato un messaggio che indica che la configurazione di Terraform è valida.
  4. Modificare il file main.tf.

  5. Nella riga 5 inserire un errore di ortografia che rende non valida la sintassi. Sostituire ad esempio var.location con var.loaction

  6. Salvare il file.

  7. Esegui di nuovo la convalida.

    terraform validate
    

    Punti principali:

    • Viene visualizzato un messaggio di errore che indica la riga di codice in errore e una descrizione dell'errore.

Come si può notare, Terraform ha rilevato un problema nella sintassi del codice di configurazione. Questo problema impedisce la distribuzione della configurazione.

È consigliabile eseguire terraform validate sempre i file Terraform prima di eseguirli nel sistema di controllo della versione. È inoltre consigliabile includere questo livello di convalida nella pipeline di integrazione continua. Più avanti in questo articolo verrà illustrato come configurare una pipeline di Azure per la convalida automatica.

3. Convalidare la configurazione di Terraform

Nella sezione precedente è stato illustrato come convalidare una configurazione di Terraform. Tale livello di test è specifico per la sintassi. Il test non ha preso in considerazione gli elementi che potrebbero essere già stati distribuiti in Azure.

Terraform è un linguaggio dichiarativo, ovvero si dichiara quello che si vuole ottenere come risultato finale. Si supponga ad esempio che in un gruppo di risorse siano presenti 10 macchine virtuali. Viene quindi creato un file di Terraform che definisce tre macchine virtuali. L'applicazione di questo piano non incrementa il conteggio totale a 13. Terraform elimina invece sette macchine virtuali, in modo da ottenere un numero totale di tre. L'esecuzione di terraform plan consente di confermare i risultati potenziali dell'applicazione di un piano di esecuzione per evitare sorprese.

Per generare il piano di esecuzione di Terraform, eseguire terraform plan. Questo comando stabilisce la connessione alla sottoscrizione di Azure per controllare quale parte della configurazione è già stata distribuita. Terraform determina quindi le modifiche necessarie per soddisfare i requisiti indicati nel file di Terraform. In questa fase Terraform non distribuisce alcun elemento. Fornisce informazioni sugli effetti dell'applicazione del piano.

Se si segue l'articolo ed è stata eseguita la procedura descritta nella sezione precedente, eseguire il terraform plan comando :

terraform plan

Dopo l'esecuzione di terraform plan, Terraform mostra il risultato potenziale dell'applicazione del piano di esecuzione. L'output indica le risorse di Azure che verranno aggiunte, modificate ed eliminate definitivamente.

Per impostazione predefinita, Terraform archivia lo stato nella stessa directory locale in cui si trova il file di Terraform. Questo criterio è ottimale negli scenari a utente singolo. Tuttavia, quando più persone lavorano sulle stesse risorse di Azure, i file di stato locali possono uscire dalla sincronizzazione. Per risolvere questo problema, Terraform supporta la scrittura di file di stato in un archivio dati remoto ,ad esempio Archiviazione di Azure. In questo scenario l'esecuzione di terraform plan in un computer locale con un computer remoto come destinazione potrebbe risultare problematica. Potrebbe quindi essere consigliabile automatizzare la procedura di convalida come parte della pipeline di integrazione continua.

4. Eseguire l'analisi statica del codice

L'analisi statica del codice può essere eseguita direttamente nel codice di configurazione di Terraform, senza eseguirlo. Questa analisi può essere utile per rilevare problemi, ad esempio i problemi relativi alla sicurezza e il mancato rispetto della conformità.

Gli strumenti seguenti forniscono l'analisi statica per i file di Terraform:

L'analisi statica viene spesso eseguita come parte di una pipeline di integrazione continua. Questi test non richiedono la creazione di un piano di esecuzione o la distribuzione. L'esecuzione di questi test risulta quindi più rapida rispetto ad altri test e vengono in genere eseguiti per primi nel processo di integrazione continua.

5. Automatizzare i test di integrazione con Azure Pipeline

L'integrazione continua comporta l'esecuzione di test su un intero sistema quando viene apportata una modifica. In questa sezione viene visualizzata una configurazione di Azure Pipeline usata per implementare l'integrazione continua.

  1. Nell'editor preferito passare al clone locale del progetto Terraform di esempio in GitHub.

  2. Apri il file samples/integration-testing/src/azure-pipeline.yaml.

  3. Scorrere verso il basso fino alla sezione passaggi in cui viene visualizzato un set standard di passaggi usati per eseguire varie routine di installazione e convalida.

  4. Esaminare la riga Step 1: run the Checkov Static Code Analysis. In questo passaggio il progetto Checkov indicato in precedenza esegue un'analisi statica del codice nella configurazione di esempio di Terraform.

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

    Punti principali:

    • Questo script è responsabile per l'esecuzione di Checkov nell'area di lavoro di Terraform montata in un contenitore Docker. Gli agenti gestiti da Microsoft sono abilitati per Docker. L'esecuzione di strumenti in un contenitore Docker risulta più facile e consente di evitare la necessità di installare Checkov nell'agente di Azure Pipelines.
    • La variabile $(terraformWorkingDirectory) viene definita nel file azure-pipeline.yaml.
  5. Esaminare la riga Step 2: install Terraform on the Azure Pipelines agent. L'estensione Terraform Build & Release Task installata in precedenza include un comando per l'installazione di Terraform nell'agente che esegue la pipeline di Azure. Nel passaggio viene eseguita questa attività.

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

    Punti principali:

    • La versione di Terraform da installare viene specificata tramite una variabile di Azure Pipelines denominata terraformVersion e definita nel file azure-pipeline.yaml.
  6. Esaminare la riga Step 3: run Terraform init to initialize the workspace. Dopo l'installazione di Terraform nell'agente sarà possibile inizializzare la directory di Terraform.

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

    Punti principali:

    • L'input command specifica il comando di Terraform da eseguire.
    • L'input workingDirectory indica il percorso della directory di Terraform.
    • La variabile $(terraformWorkingDirectory) viene definita nel file azure-pipeline.yaml.
  7. Esaminare la riga Step 4: run Terraform validate to validate HCL syntax. Dopo l'inizializzazione della directory del progetto viene eseguito il comandoterraform validate per convalidare la configurazione sul server.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform validate'
      inputs:
        command: validate
        workingDirectory: $(terraformWorkingDirectory)
    
  8. Esaminare la riga Step 5: run Terraform plan to validate HCL syntax. Come illustrato in precedenza, il piano di esecuzione viene generato per verificare la validità della configurazione di Terraform prima della distribuzione.

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

    Punti principali:

    • L'input environmentServiceName fa riferimento al nome della connessione al servizio di Azure creata in Configurare l'ambiente. La connessione consente a Terraform di accedere alla sottoscrizione di Azure.
    • L'input commandOptions viene usato per passare argomenti al comando di Terraform. In questo caso viene specificata una posizione. La variabile $(azureLocation) viene definita in precedenza nel file YAML.

Importare la pipeline in Azure DevOps

  1. Aprire il progetto di Azure DevOps e passare alla sezione Azure Pipelines.

  2. Selezionare il pulsante Crea pipeline.

  3. Per l'opzione Dov'è il codice? selezionare GitHub (YAML).

    Dov'è il codice?

  4. A questo punto potrebbe essere necessario autorizzare Azure DevOps ad accedere l'organizzazione. Per altre informazioni su questo argomento, vedere l'articolo Creare repository di GitHub.

  5. Nell'elenco di repository selezionare il fork del repository creato nell'organizzazione di GitHub.

  6. Nel passaggio Configura la pipeline scegliere una pipeline YAML esistente come punto di partenza.

    Pipeline YAML esistente

  7. Quando viene visualizzata la pagina Seleziona un file YAML esistente specificare il ramo master e immettere il percorso della pipeline YAML: samples/integration-testing/src/azure-pipeline.yaml.

    Seleziona un file YAML esistente

  8. Selezionare Continua per caricare la pipeline YAML di Azure da GitHub.

  9. Quando viene visualizzata la pagina Esamina il codice YAML della pipeline, selezionare Esegui per creare e attivare manualmente la pipeline per la prima volta.

    Eseguire una pipeline di Azure

Verificare i risultati

È possibile eseguire la pipeline manualmente dall'interfaccia utente di Azure DevOps. L'obiettivo dell'articolo consiste tuttavia nell'illustrare l'integrazione continua automatica. Testare il processo eseguendo il commit di una modifica nella cartella samples/integration-testing/src del repository con fork. La modifica attiverà automaticamente una nuova pipeline nel ramo in cui si esegue il push del codice.

Pipeline in esecuzione da GitHub

Dopo avere completato il passaggio, accedere ai dettagli in Azure DevOps per assicurarsi che non si siano verificati problemi durante l'esecuzione.

Pipeline verde di Azure DevOps

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Passaggi successivi