DA MASER A MONFUMO | MOTO GUZZI V85TT | PURE SOUND POV 4K

🏍️ Il mio nuovo canale YouTube: giri in moto in POV, solo audio, tra le Dolomiti in 4K. Niente musica, niente parole — solo il motore e le Alpi. Vieni a fare un giro!

Iscriviti

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:

shell
terraform workspace create <name>

Per passare ad altri workspace, esegui invece:

shell
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.tf Questo 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.tf Anche questo file non cambierà mai. Qui definisco l'output del modulo vars in 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.tf Questo file definisce le variabili necessarie per inizializzare il modulo. Gli output del 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.tf Questi 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 valore node_pool_machine_type in 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
		...
	}
]

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!