Oggi, l'infrastructure as code (IaC) e l'immutabilità sono strettamente legate insieme. IaC ci consente di definire tutto come codice, mentre l'immutabilità porta uniformità, affidabilità e velocità. I server sono definiti come codice sotto forma di configurazioni e script utilizzati per creare immagini VM. I cluster sono definiti come codice sotto forma di istruzioni su come creare e gestire le VM basate su tali immagini e su come collegarle tra loro tramite diversi servizi.
Gli strumenti di gestione della configurazione "tradizionali" come CFEngine, Chef, Puppet, Ansible e altri ci consentono di definire l'infrastruttura come codice, ma non sono basati sui principi di immutabilità. Ciò non significa che non possano essere utilizzati per creare infrastrutture immutabili, ma piuttosto che non sono progettati per questo. In quanto tali, tendono a non essere ottimali nell'esecuzione di tali processi. Possiamo considerarli come la prima generazione di tali strumenti. Anche se alcuni sono più nuovi e più avanzati di altri, li metto nello stesso calderone poiché si basano tutti sugli stessi principi.
Oggi abbiamo a nostra disposizione opzioni migliori. Potremmo adottare strumenti specifici del fornitore come CloudFormation per AWS o qualunque cosa fornisca il tuo fornitore di hosting. Ma non sono, secondo me, la scelta giusta. Sono chiusi e focalizzati su un'unica piattaforma.
Il "re dell'infrastruttura come codice" di oggi è Terraform. È progettato da zero come un'infrastruttura immutabile come soluzione di codice. È di gran lunga il più utilizzato e quasi tutti i fornitori di servizi rispettabili hanno creato moduli per le loro piattaforme. L'ampiezza della sua adozione può essere vista dall'elenco dei fornitori di Terraform attualmente disponibili. Tutti quelli che contano sono lì. Se il tuo provider non è nell'elenco, non dovresti cercare uno strumento diverso, ma piuttosto cambiare il provider. Inoltre, Terraform ha una delle comunità di contributori più grandi e attive ed è altamente estensibile attraverso il suo sistema di plugin. Il suo significato diventa ancora più evidente una volta che ci rendiamo conto che molti dei fornitori hanno abbandonato i propri strumenti simili a favore di Terraform.
Utilizzo di Terraform per gestire l'infrastruttura come codice (IaC)
La capacità di Terraform di utilizzare diversi fornitori e gestire varie risorse è combinata con la creazione di modelli. Il suo sistema di variabili ci permette di modificare facilmente aspetti della nostra infrastruttura senza apportare modifiche alle definizioni delle risorse. Inoltre, è idempotente. Quando applichiamo una serie di definizioni, converge l'effettivo nello stato desiderato, indipendentemente dal fatto che ciò significhi creazione, distruzione o modifica della nostra infrastruttura e dei nostri servizi. La caratteristica che mi piace di più è la capacità di Terraform di produrre un piano. Ci mostra quali risorse verranno create, quali verranno modificate e quali verranno distrutte se scegliamo di applicare le modifiche nelle definizioni. Questo ci consente di ottenere informazioni su "cosa accadrà prima che accada". Se adottiamo i principi di GitOps e attiviamo Terraform solo quando apportiamo una modifica a un repository, possiamo avere una pipeline che produrrà il piano quando creiamo una richiesta pull. In questo modo, possiamo facilmente rivedere le modifiche che verranno applicate alla nostra infrastruttura e decidere se unire le modifiche. Se eseguiamo l'unione, un'altra pipeline potrebbe applicare tali modifiche dopo essere stata attivata tramite un webhook. Ciò lo rende un candidato perfetto per un mix semplice ma molto efficace di infrastruttura come principi di codice combinati con GitOps e automatizzati attraverso strumenti di distribuzione continua (Continuous Deployment).
Terraform memorizza lo stato effettivo in un file system. Ciò gli consente di essere in grado di produrre piani e applicare le modifiche alle definizioni essendo in grado di confrontare lo stato desiderato con lo stato effettivo. Tuttavia, archiviare il suo stato a livello locale non è sicuro e potrebbe impedirci di lavorare come una squadra. Fortunatamente, Terraform ci consente di utilizzare diversi backend in cui è possibile memorizzare il suo stato. Possono essere un'unità di rete, un database o quasi qualsiasi altro archivio. Un'altra caratteristica davvero interessante è la capacità di Terraform di districare le dipendenze tra diverse risorse. In quanto tale, è in grado di capire da solo in quale ordine le risorse devono essere create, modificate o distrutte. Tuttavia, quelle e altre caratteristiche di Terraform non sono uniche. Anche altri strumenti li hanno. Ciò che rende Terraform davvero speciale è la facilità con cui possiamo sfruttare le sue caratteristiche e la robustezza della piattaforma e dell'ecosistema che la circonda. Non è un caso che sia lo standard de facto e la scelta popolare di molti.
Fonte: The DevOps Toolkit: Catalog, Patterns, And Blueprints