Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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, si crea un piano di esecuzione che consente di visualizzare in anteprima le modifiche dell'infrastruttura prima della distribuzione. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.
I test end-to-end (E2E) vengono usati per convalidare il funzionamento di un programma prima di distribuirlo nell'ambiente di produzione. Uno scenario di esempio potrebbe essere un modulo Terraform che distribuisce due macchine virtuali in una rete virtuale. È possibile impedire che i due computer eseseguono il ping tra loro. In questo esempio è possibile definire un test per verificare il risultato previsto prima della distribuzione.
I test E2E sono in genere un processo in tre passaggi.
- Una configurazione viene applicata a un ambiente di test.
- Il codice viene eseguito per verificare i risultati.
- L'ambiente di test viene reinizializzato o disattivato, come ad esempio la deallocazione di una macchina virtuale.
In questo articolo vengono illustrate le operazioni seguenti:
- Comprendere le nozioni di base dei test end-to-end con Terratest
- Informazioni su come scrivere test end-to-end con Golang
- Informazioni su come usare Azure DevOps per attivare automaticamente test end-to-end quando viene eseguito il commit del codice nel repository
1. Configurare l'ambiente
- Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
Configurare Terraform: se non è già stato fatto, configurare Terraform usando una delle opzioni seguenti:
Linguaggio di programmazione Go: installare Go.
Codice e risorse di esempio: Usando lo strumento DownGit, scaricare da GitHub il progetto end-to-end-testing e decomprimere in una nuova directory per contenere il codice di esempio. Questa directory viene definita directory di esempio.
2. Comprendere i test end-to-end
I test end-to-end convalidano il funzionamento di un sistema come intero collettivo. Questo tipo di test è contrapposto al testare moduli specifici. Per i progetti Terraform, i test end-to-end consentono la convalida di ciò che è stato distribuito. Questo tipo di test differisce da molti altri tipi che testano scenari di pre-distribuzione. I test end-to-end sono fondamentali per testare sistemi complessi che includono più moduli e agiscono su più risorse. In questi scenari, il test end-to-end è l'unico modo per determinare se i vari moduli interagiscono correttamente.
Questo articolo è incentrato sull'uso di Terratest per implementare test end-to-end. Terratest fornisce tutte le tubature necessarie per eseguire l'attività seguente:
- Distribuire una configurazione Terraform
- Consente di scrivere un test usando il linguaggio Go per convalidare ciò che è stato distribuito
- Orchestrare i test in fasi
- Rimuovere l'infrastruttura distribuita
3. Comprendere l'esempio di test
Per questo articolo viene usato un esempio disponibile nel repository di esempio Azure/terraform.
Questo esempio definisce una configurazione terraform che distribuisce due macchine virtuali Linux nella stessa rete virtuale. Una macchina virtuale denominata vm-linux-1
ha un indirizzo IP pubblico. Viene aperta solo la porta 22 per consentire le connessioni SSH. La seconda macchina virtuale- vm-linux-2
non ha un indirizzo IP pubblico definito.
Il test convalida gli scenari seguenti:
- L'infrastruttura viene distribuita correttamente
- Usando la porta 22, è possibile aprire una sessione SSH per
vm-linux-1
- Usando la sessione SSH in
vm-linux-1
, è possibile effettuare il pingvm-linux-2
Se è stato scaricato l'esempio, la configurazione di Terraform per questo scenario è disponibile nel src/main.tf
file . Il main.tf
file contiene tutti gli elementi necessari per distribuire l'infrastruttura di Azure rappresentata nella figura precedente.
Se non si ha familiarità con la creazione di una macchina virtuale, vedere Creare una macchina virtuale Linux con l'infrastruttura in Azure usando Terraform.
Attenzione
Lo scenario di esempio presentato in questo articolo è solo a scopo illustrativo. Abbiamo volutamente mantenuto le cose semplici per concentrarci sui passaggi di un test end-to-end. Non è consigliabile avere macchine virtuali di produzione che espongono porte SSH su un indirizzo IP pubblico.
4. Esaminare l'esempio di test
Il test end-to-end viene scritto nel linguaggio Go e usa il framework Terratest. Se è stato scaricato l'esempio, il test viene definito nel src/test/end2end_test.go
file .
Il codice sorgente seguente mostra la struttura standard di un test Golang usando Terratest:
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
test_structure "github.com/gruntwork-io/terratest/modules/test-structure"
)
func TestEndToEndDeploymentScenario(t *testing.T) {
t.Parallel()
fixtureFolder := "../"
// Use Terratest to deploy the infrastructure
test_structure.RunTestStage(t, "setup", func() {
terraformOptions := &terraform.Options{
// Indicate the directory that contains the Terraform configuration to deploy
TerraformDir: fixtureFolder,
}
// Save options for later test stages
test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)
// Triggers the terraform init and terraform apply command
terraform.InitAndApply(t, terraformOptions)
})
test_structure.RunTestStage(t, "validate", func() {
// run validation checks here
terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
})
// When the test is completed, teardown the infrastructure by calling terraform destroy
test_structure.RunTestStage(t, "teardown", func() {
terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
terraform.Destroy(t, terraformOptions)
})
}
Come si può notare nel frammento di codice precedente, il test è composto da tre fasi:
- setup: esegue Terraform per distribuire la configurazione
- validate': esegue i controlli di convalida e le asserzioni
- teardown: ripulisce l'infrastruttura dopo l'esecuzione del test
L'elenco seguente mostra alcune delle funzioni chiave fornite dal framework Terratest:
-
terraform. InitAndApply: abilita l'esecuzione
terraform init
eterraform apply
dal codice Go - terraform. Output: recupera il valore della variabile di output della distribuzione.
-
terraform.Destroy: esegue il comando
terraform destroy
dal codice Go. - test_structure.LoadTerraformOptions: carica le opzioni Terraform - come configurazione e variabili - dallo stato
- test_structure. SaveTerraformOptions: salva le opzioni di Terraform, ad esempio la configurazione e le variabili, nello stato
5. Eseguire l'esempio di test
I passaggi seguenti eseguono il test sulla configurazione e sulla distribuzione di esempio.
Aprire una finestra bash/terminale.
Accedi al tuo account Azure.
Per eseguire questo test di esempio, è necessario un nome
id_rsa
di coppia di chiavi SSH privata/pubblica eid_rsa.pub
nella home directory. Sostituire<your_user_name>
con il nome della home directory.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
All'interno della directory di esempio, naviga alla directory
src/test
.Eseguire il test.
go test -v ./ -timeout 10m
6. Verificare i risultati
Dopo aver eseguito go test
correttamente , vengono visualizzati risultati simili all'output seguente:
--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok test 391.052s
Risolvere i problemi di Terraform in Azure
Risolvere i problemi comuni relativi all'uso di Terraform in Azure