Usiamo molto Terraform sia per testare la nostra infrastruttura che per distribuire progetti all’interno di DownToZero.
Dal momento che DTZ è supportato come provider abbiamo iniziato a implementare progetti basati su di esso. Una cosa che ricorre regolarmente è la posizione del file di stato. Verificare lo stato nel repository git di solito non è una buona idea (anche se è comunque meglio che tenerlo localmente), ma avere una qualche forma di stato remoto aiuta molto nell’esecuzione di TF nelle pipeline e nel rendere lo stato indipendente dal progetto.
Guardando le nostre opzioni per lo stato remoto, ce ne sono parecchie. Purtroppo la maggior parte sono legate a provider cloud, cosa che al momento non è di grande aiuto per noi. Esiste però il provider backend generico http.
Osservando questo provider abbiamo scoperto che possiamo usarlo per connetterci al nostro objectstore e utilizzare il nostro sistema per conservare il file di stato.
Ecco come apparirebbe.
terraform {
required_providers {
dtz = {
source = "DownToZero-Cloud/dtz"
version = ">= 0.1.24"
}
}
backend "http" {
address = "http://objectstore.dtz.rocks/api/2022-11-28/obj/tf-test/state.tfstate"
update_method = "PUT"
username = "apikey"
password = var.apikey
}
}
Purtroppo il locking non funziona, poiché presenta alcuni dettagli di implementazione non compatibili con il nostro objectstore.
L’objectstore non supporta i metodi http LOCK, UNLOCK (anche se questo è modificabile nel provider).
L’altra limitazione è il codice di ritorno: l’objectstore restituisce sempre uno status HTTP-201 (CREATED) se l’oggetto è stato salvato. Il provider terraform invece si aspetta solo un HTTP-200 (OK). Esiste già una issue aperta e una pull request in merito, ma sono in sospeso da anni. Quindi non mi aspetto una soluzione a breve.