Moduli Terraform

Moduli Terraform



Nel mondo del provisioning e della gestione dell'infrastruttura, Terraform è emersa come una scelta popolare tra gli sviluppatori e i team operativi. Con la sua sintassi dichiarativa (HCL – HashiCorp Configuration Language) e il supporto per vari fornitori di infrastrutture, Terraform consente pratiche di infrastruttura come codice (IaC).

Una delle sue caratteristiche principali è l'uso di moduli che consentono di creare e riutilizzare il codice dell'infrastruttura modulare. In questo articolo, esploreremo il concetto di moduli Terraform e come possono aiutare a organizzare e semplificare il nostro codice dell'infrastruttura.







Introduzione ai moduli Terraform

I moduli Terraform sono pacchetti autonomi di configurazioni Terraform che rappresentano un set di risorse con variabili di input e output definite. Forniscono un modo per incapsulare e riutilizzare il codice dell'infrastruttura che semplifica la gestione e la manutenzione di implementazioni di infrastrutture complesse.



I moduli possono essere creati e utilizzati internamente all'interno di un progetto o condivisi tra più progetti o team.



Organizzazione del Modulo

Quando si organizzano i moduli Terraform, è comune avere una struttura gerarchica costituita da moduli radice e figlio. Esploriamo come funziona questa organizzazione.





Modulo radice



Il modulo radice rappresenta il modulo di primo livello nella nostra configurazione Terraform. È il punto di ingresso per definire l'infrastruttura complessiva e gestire le relazioni tra le diverse risorse.

Il modulo radice in genere contiene il file 'main.tf' in cui definiamo le risorse e le configurazioni che costituiscono la base della nostra infrastruttura. Facoltativamente, possiamo avere i file 'variables.tf' e 'outputs.tf'. Inoltre, possiamo definire la nostra directory 'modules' all'interno della directory root per accedere facilmente ai moduli figli.

Moduli figlio

I moduli figlio sono componenti modulari che incapsulano insiemi specifici di risorse o configurazioni. Sono progettati per essere riutilizzabili e rappresentano le unità autonome della funzionalità dell'infrastruttura.

I moduli figlio possono essere utilizzati all'interno della radice o di altri moduli figlio che consentono la composizione e la creazione di infrastrutture complesse. Ogni modulo figlio ha tipicamente la sua directory che contiene i file di configurazione necessari come 'main.tf', 'variables.tf' e 'outputs.tf'.

Ora, vediamo come possiamo creare un modulo Terraform.

Creazione di un modulo Terraform

Quando creiamo moduli Terraform, dobbiamo creare una nuova directory per il modulo con i file di configurazione Terraform richiesti. Di solito, quella directory si chiama 'modules'. Definirlo all'interno della directory principale del nostro progetto è una best practice.

Facciamo un semplice esempio di un semplice modulo per il provisioning di un server Web locale utilizzando Docker. Innanzitutto, definiamo il modulo nella directory 'modules' come 'main.tf'.

risorsa 'docker_container' 'server web' {
name  = var.name
immagine = var.immagine
porti {
internal = var.internal_port
esterno = var.external_port
}
}

Qui, creiamo un modulo chiamato 'docker_container' che accetta il nome del contenitore, l'immagine Docker, la porta interna e la porta esterna come variabili di input. Il modulo incapsula la logica per creare una risorsa contenitore Docker e consente al chiamante di personalizzare le proprietà del contenitore.

Come mostrato nell'immagine seguente, creiamo un file separato chiamato 'variables.tf' nella directory 'modules' per definire le variabili di input che possono essere personalizzate quando si utilizza il modulo:

variabile 'nome' {
descrizione = 'Nome contenitore Docker'
tipo = stringa
}

variabile 'Immagine' {
descrizione = 'Immagine Docker'
tipo = stringa
}

variabile 'porta_interna' {
descrizione = 'Porta interna sul container Docker'
tipo = numero
}

variabile 'porta_esterna' {
descrizione = 'Porta esterna a cui mappare'
tipo = numero
}

Qui, abbiamo dichiarato quattro variabili, ciascuna con 'descrizione' e 'tipo' come attributi e relativi valori.

Utilizzo di un modulo Terraform

Poiché abbiamo creato il nostro modulo, ora possiamo usarlo nella nostra configurazione principale di Terraform facendo riferimento alla sua fonte. Creiamo il nostro file di configurazione principale che è 'main.tf' nella directory principale.

modulo 'webserver_contenitore' {
fonte = '../modules/docker_container'
nome              = 'miowebserver'
immagine           = 'nginx: ultimo'
porta_interna   = 80
porta_esterna   = 8080
}

Usiamo il blocco 'module' nel codice precedente per creare un'istanza del modulo contenitore Docker. Forniamo i valori di input necessari per il modulo come il nome del contenitore, l'immagine Docker e la configurazione della porta. Il parametro 'source' specifica il percorso relativo alla directory 'module'.

Successivamente, vediamo come utilizzare gli output di Terraform da utilizzare con i moduli.

Uscite del modulo

Gli output del modulo in Terraform forniscono un modo per esporre valori specifici all'interno di un modulo, rendendoli disponibili per l'uso nella configurazione principale o da altri moduli. Fungono da canale di comunicazione tra il modulo e il chiamante che consente al modulo di fornire informazioni o dati che possono essere utili o necessari per ulteriori configurazioni o decisioni.

produzione 'contenitore_id' {
descrizione = 'ID del contenitore Docker creato'
valore       = docker_container.webserver.id
}

Qui, abbiamo creato un file 'outputs.tf' all'interno della directory 'modules'. Questa variabile di output espone l'ID del contenitore Docker creato dalla risorsa 'docker_container' denominata 'webserver' all'interno del modulo.

Ora possiamo accedere all'ID contenitore nel nostro file di configurazione root. Fare riferimento al seguente codice aggiornato del file 'main.tf' nella directory principale:

modulo 'webserver_contenitore' {
fonte = '../modules/docker_container'
nome              = 'miowebserver'
immagine           = 'nginx: ultimo'
porta_interna   = 80
porta_esterna   = 8080
}

risorsa 'volume_docker' 'dati' {
# Il resto degli argomenti va qui
legamento = module.webserver_container.container_id
}

Utilizzando 'module.webserver_container.container_id' come valore per l'argomento 'bind', indichiamo a Terraform di associare il volume Docker alla posizione specificata dall'ID contenitore del modulo 'web_container'. Ciò stabilisce una relazione tra la risorsa del volume Docker e il contenitore creato dal modulo 'webserver_container', assicurando che il volume sia montato nella posizione appropriata.

Best practice per i moduli Terraform

Modularizza per la riutilizzabilità

Dovremmo considerare la riusabilità durante la progettazione dei moduli. Inoltre, dobbiamo identificare i componenti o i modelli logici della nostra infrastruttura e incapsularli in moduli separati. Ciò promuove il riutilizzo del codice, la standardizzazione e una collaborazione più semplice tra i team.

Denominazione chiara e coerente

L'uso di convenzioni di denominazione chiare e coerenti per moduli, variabili e risorse migliora la leggibilità e la comprensione della base di codice, il che rende più facile per gli altri lavorare e mantenere i moduli.

Isolare le dipendenze

Dobbiamo evitare un accoppiamento stretto tra i moduli. Ogni modulo dovrebbe incapsulare le proprie risorse e dipendenze. Ciò garantisce che i moduli possano essere riutilizzati in modo indipendente e promuove un migliore isolamento e incapsulamento.

Controllo della versione e registro del modulo

Possiamo pubblicare i nostri moduli in un repository controllato dalla versione o in un registro dei moduli. Ciò fornisce una posizione centralizzata per la condivisione e la scoperta dei moduli, garantendo un facile accesso e controllo delle versioni.

Conclusione

Abbiamo fatto una breve introduzione ai moduli Terraform e abbiamo imparato come crearli con un semplice esempio. Quindi, abbiamo esaminato come utilizzare le variabili e gli output con il nostro modulo per migliorarne la flessibilità, la riusabilità e la manutenibilità. In conclusione, i moduli Terraform sono potenti strumenti per organizzare e semplificare il codice dell'infrastruttura. Ci consentono di incapsulare un insieme di risorse o configurazioni in componenti riutilizzabili che promuovono modularità, riutilizzabilità e collaborazione all'interno dei nostri progetti di infrastruttura come codice.