Creare macchine virtuali con l'interfaccia web va benissimo per le prime prove. Dopo qualche mese, però, nessuno ricorda più perché una VM ha 6 GB di RAM invece di 4, o quali opzioni erano state attivate su quella del reverse proxy. L'infrastruttura come codice risolve questo problema: le macchine si descrivono in file di testo, e uno strumento si occupa di creare, modificare o eliminare le risorse finché la realtà corrisponde alla descrizione.
Terraform e OpenTofu
Terraform è lo strumento che ha reso popolare questo approccio. Nel 2023 il suo sviluppatore ne ha cambiato la licenza passando a una licenza non open source; in risposta è nato OpenTofu, un fork rimasto open source e ospitato dalla Linux Foundation. I due strumenti condividono il linguaggio di configurazione, chiamato HCL, e in larga parte anche i provider. Per un homelab, OpenTofu è la scelta naturale se si vuole restare su software libero; i concetti che seguono valgono per entrambi.
I concetti fondamentali
- Provider: il plugin che sa parlare con un sistema specifico, come l'API di Proxmox VE. Per Proxmox esistono provider mantenuti dalla comunità, e conviene sceglierne uno attivamente sviluppato verificando la sua documentazione.
- Risorsa: un oggetto da gestire, per esempio una macchina virtuale o un container.
- Stato: un file in cui lo strumento registra quali risorse ha creato e con quali attributi. È così che sa cosa modificare al giro successivo.
- Plan e apply:
tofu planmostra le modifiche che verrebbero fatte;tofu applyle esegue dopo una conferma.
Un esempio di flusso
Una configurazione minima ha tre parti: il provider, le variabili, le risorse. In forma semplificata, una macchina virtuale clonata da un template con cloud-init potrebbe essere descritta così:
resource "proxmox_virtual_environment_vm" "monitor" {
name = "monitor"
node_name = "pve1"
clone { vm_id = 9000 }
cpu { cores = 2 }
memory { dedicated = 4096 }
initialization {
ip_config {
ipv4 {
address = "192.168.20.30/24"
gateway = "192.168.20.1"
}
}
}
}
I nomi esatti dei blocchi dipendono dal provider scelto, quindi l'esempio va adattato alla sua documentazione. Il flusso di lavoro è sempre lo stesso:
tofu initscarica il provider;tofu planmostra che verrà creata una VM;tofu applyla crea;- si modifica la memoria nel file,
tofu planmostra una sola modifica,tofu applyla applica.
Credenziali e segreti
Lo strumento si collega all'API dell'hypervisor con un token API. Alcune regole:
- creare un utente dedicato con i soli permessi necessari, non usare l'account di amministrazione principale;
- non scrivere token e password nei file versionati: passarli con variabili d'ambiente o file di variabili esclusi dal repository;
- ricordare che il file di stato può contenere valori sensibili in chiaro; va protetto come un segreto e non pubblicato.
OpenTofu offre anche la cifratura del file di stato, una funzione che Terraform non include nella sua versione libera. Per un homelab con il repository su un servizio esterno, è una buona ragione in più per preferirlo.
Dove conservare lo stato
In casa la soluzione più semplice è lo stato locale, in una cartella sottoposta a backup. Se si lavora da più computer, si può usare un backend remoto compatibile con S3, come un servizio di archiviazione a oggetti ospitato in casa. L'importante è che esista un'unica copia autorevole: due stati divergenti portano lo strumento a creare doppioni o a cancellare risorse inaspettatamente.
Dividere i compiti con la gestione della configurazione
OpenTofu crea l'infrastruttura: macchine, dischi, reti. Configurare ciò che sta dentro le macchine, cioè pacchetti, file e servizi, è il compito di strumenti di gestione della configurazione come Ansible o del cloud-init stesso. Una divisione chiara funziona bene:
| Livello | Strumento |
|---|---|
| Creazione VM e container | OpenTofu o Terraform |
| Primo avvio, utenti, chiavi SSH | cloud-init |
| Pacchetti, configurazioni, servizi | Ansible |
| Applicazioni | file Compose versionati |
Quando conviene, e quando no
Nel mio lavoro trovo che l'infrastruttura come codice ripaghi lo sforzo quando le macchine sono più di una manciata, quando si ricostruiscono spesso o quando si vuole poter ricreare tutto dopo un guasto. Per un homelab con tre VM che non cambiano mai, il guadagno è soprattutto didattico, e anche quello ha valore, perché sono le stesse competenze usate nel cloud.
Un consiglio pratico: non importare subito tutta l'infrastruttura esistente. Si comincia gestendo con il codice solo le nuove macchine, e si porta il resto un pezzo alla volta.
In sintesi
- Le macchine si descrivono in file HCL; plan mostra le modifiche, apply le esegue.
- OpenTofu è il fork open source di Terraform, con linguaggio e provider compatibili.
- Token API con permessi minimi e segreti fuori dal repository.
- Il file di stato è sensibile e deve esistere in un'unica copia autorevole.
- OpenTofu crea le macchine; cloud-init e Ansible ne configurano il contenuto.