I workspace sono istanze separate di dati di stato che possono essere utilizzate dalla stessa directory di lavoro. Puoi usare i workspace per gestire più gruppi di risorse non sovrapposti con la stessa configurazione. Per creare e passare a un nuovo workspace, dopo aver eseguito terraform init, esegui:
terraform workspace create <name>Per passare ad altri workspace, esegui invece:
terraform workspace select <name>Usare il workspace selezionato nei file Terraform
Il workspace selezionato è disponibile nei file .tf tramite la variabile terraform.workspace (è una stringa). Mi piace assegnarne il valore a una variabile locale chiamata environment (poiché il nome dei workspace corrisponde a quello degli ambienti).
locals {
environment = terraform.workspace
}Aggiungere la configurazione per ambiente in un nuovo modulo
Ora che hai una variabile contenente l'ambiente (è solo una stringa) su cui stai operando, puoi creare un modulo con la configurazione specifica per ambiente. Ho creato un modulo vars all'interno della directory modules del mio repository, che contiene almeno i seguenti file:
main.tfQuesto file non cambierà mai, poiché serve solo ad aggregare le variabili che verranno esportate.
locals {
environments = {
"development" : local.development,
"acceptance" : local.acceptance,
"production" : local.production
}
}outputs.tfAnche questo file non cambierà mai. Qui definisco l'output del modulovarsin modo che possa essere usato da qualsiasi altro punto del repository Terraform. I valori esportati dipendono dal workspace selezionato.
output "env" {
value = local.environments[var.environment]
}variables.tfQuesto file definisce le variabili necessarie per inizializzare il modulo. Glioutputdel modulo dipendono dal workspace (ambiente) selezionato, di cui il modulo deve essere a conoscenza.
variable "environment" {
description = "The environment which to fetch the configuration for."
type = string
}development.tf&acceptance.tf&production.tfQuesti file contengono i valori effettivi che differiscono per ambiente. Ad esempio, quando si configura un cluster GKE, potresti voler usare macchine economiche per il node pool di sviluppo e macchine più performanti in produzione. Questo si ottiene definendo un valorenode_pool_machine_typein ciascun ambiente, come segue:
// in development.tf
locals {
development = {
node_pool_machine_type = "n2-standard-2"
}
}// in acceptance.tf
locals {
acceptance = {
node_pool_machine_type = "n2-standard-4"
}
}// in production.tf
locals {
production = {
node_pool_machine_type = "n2-standard-8"
}
}Il modulo vars è ora pronto per essere usato da qualsiasi punto del repository, ad esempio nel file main.tf. Per accedere ai valori di configurazione, inizializza il modulo come segue:
#
# Fetch variables based on Environment
#
module "vars" {
source = "./modules/vars"
environment = local.environment
}La configurazione corretta verrà restituita in base al Terraform Workspace (nome dell'ambiente) passato al modulo, e i valori sono accessibili tramite module.vars.env.<nome-variabile>. Ad esempio:
node_pools = [
{
...
machine_type = module.vars.env.node_pool_machine_type
...
}
]Riepilogo
In questo articolo ho mostrato come usare i Terraform Workspace per passare tra diverse configurazioni in base all'ambiente su cui si sta lavorando, mantenendo la configurazione il più semplice e pulita possibile. Sei interessato ad altri articoli su Terraform? Dai un'occhiata a How to Deploy ElasticSearch on GKE using Terraform and Helm!
lucavallin

