Questo documento fornisce linee guida e consigli da tenere presenti quando si utilizza moduli Terraform riutilizzabili.
Questa guida non è un'introduzione a Terraform. Per un'introduzione all'utilizzo Terraform con Google Cloud, consulta Inizia a utilizzare Terraform.
Attiva le API richieste nei moduli
I moduli Terraform possono attivare tutti i servizi richiesti utilizzando
google_project_service
risorsa o la
project_services
.
L'inclusione dell'attivazione dell'API semplifica le dimostrazioni.
- Se l'attivazione dell'API è inclusa in un modulo, l'attivazione dell'API deve
disabilitabile esponendo una variabile
enable_apis
il cui valore predefinitotrue
. Se l'attivazione dell'API è inclusa in un modulo, l'attivazione dell'API deve imposta
disable_services_on_destroy
sufalse
, perché questo attributo può causare problemi quando si lavora con più istanze del modulo.Ad esempio:
module "project-services" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 12.0" project_id = var.project_id enable_apis = var.enable_apis activate_apis = [ "compute.googleapis.com", "pubsub.googleapis.com", ] disable_services_on_destroy = false }
Includi un file dei proprietari
Per tutti i moduli condivisi, includi una
OWNERS
(o
CODEOWNERS
su GitHub), documentando i responsabili del modulo. Prima di qualsiasi pull
richiesta unita, che deve essere approvata da un proprietario.
Versioni con tag della release
A volte i moduli richiedono modifiche che provocano un errore e devi comunicare per gli utenti, in modo che possano bloccare le configurazioni completamente gestita.
Assicurati che i moduli condivisi seguano SemVer versione 2.0.0 quando vengono codificate o rilasciate nuove versioni.
Quando fai riferimento a un modulo, utilizza un vincolo di versione per bloccare la versione principale. Ad esempio:
module "gke" {
source = "terraform-google-modules/kubernetes-engine/google"
version = "~> 20.0"
}
Non configurare provider o backend
I moduli condivisi non devono configurare provider o backend. Devi invece configurare provider e backend nei moduli principali.
Per i moduli condivisi, definisci le versioni minime richieste del provider in un
required_providers
, come segue:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = ">= 4.0.0"
}
}
}
Se non dimostrato diversamente, supponiamo che le nuove versioni del provider funzionino.
Esporre le etichette come variabili
Consenti flessibilità nell'etichettatura delle risorse tramite l'interfaccia del modulo.
Potresti fornire una variabile labels
con il valore predefinito di una mappa vuota, ad esempio
che segue:
variable "labels" {
description = "A map of labels to apply to contained resources."
default = {}
type = "map"
}
Esponi gli output per tutte le risorse
Variabili e output consentono di dedurre le dipendenze tra moduli e risorse. Senza output, gli utenti non possono ordinare correttamente il modulo in relazione le rispettive configurazioni Terraform.
Per ogni risorsa definita in un modulo condiviso, includi almeno un output che fa riferimento alla risorsa.
Usa sottomoduli in linea per la logica complessa
- I moduli in linea consentono di organizzare moduli Terraform complessi in unità più piccole e deduplicare le risorse comuni.
- Posiziona i moduli incorporati in
modules/$modulename
. - Considerare i moduli in linea come privati e non per essere utilizzati da moduli esterni. salvo diversa indicazione nella documentazione del modulo condiviso.
- Terraform non monitora le risorse sottoposte a refactoring. Se inizi con diverse
nel modulo di primo livello e quindi mettile nei sottomoduli
Terraform tenta di ricreare tutte le risorse sottoposte a refactoring. Per limitare questo
il comportamento delle persone, usa
moved
i blocchi durante il refactoring. - Gli output definiti dai moduli interni non vengono esposti automaticamente. Per condividere gli output dei moduli interni, esportali di nuovo.
Passaggi successivi
- Scopri le best practice generali su stile e struttura per Terraform su Google Cloud.
- Scopri le best practice per l'utilizzo dei moduli principali di Terraform.