Implementare una piattaforma IaC con Terraform, Ansible e GitLab

Date le necessità di creare infrastrutture in ambienti multipli mentre si mantiene la standardizzazione e il monitoraggio efficiente, diventa fondamentale provvedere a questi ambienti in modo sicuro. Per raggiungere questo obiettivo, adottare un approcio di infrastruttura immutabile, in cui gli ambienti sono provvisti come codice, è essenziale.

Lo scopo di questo articolo è dimostrare un approcio possibile per raggiungere questo obiettivo utilizzando le strutture di GitLab per enforcare i template e gli standard, Terraform per applicare e mantenere gli standard sui server, e Ansible per la provvisionatura e la configurazione del software, utilizzando un modello di ruoli condiviso tra repository. Per gestire lo stato delle macchine con Terraform, usiamo MinIO, in quanto consente questa implementazione su piattaforme locali.

Progettazione dell’architettura

Step 1

Il processo si avvia sempre con la presentazione di un issue standardizzato, specificando il modello di stack da utilizzare, se sono necessarie autorizzazioni di firewall e se si tratta di un nuovo impianto o semplicemente di un aggiornamento di risorse.

Step 2

L’operatore revisiona l’issue e inizia il processo. Tutte le conversazioni e il tempo trascorso vengono registrati all’interno dell’issue.

Step 3

Nuovo progetto avviato in GitLab, basato sul modello di infrastruttura che verrà creato. questo progetto viene posizionato all’interno del Gruppo corrispondente in GitLab, dove eredita le variabili di ambiente necessarie per la creazione standard di infrastrutture.

Step 4

Quando viene creato il progetto, devi solo specificare gli IP per l’infrastruttura da fornire nell’ambiente specificato nell’issue (KVM, VMware). Dopo la pianificazione con Terraform, vengono create le risorse richieste, inclusa l’aggiunta di etichette se necessario, perché Veeam possa eseguire i backup in base alle politiche di etichetta. Al termine, lo stato dell’infrastruttura creata viene memorizzato in un bucket.

Step 5

Il prossimo passo riguarda l’esecuzione di attività standard per tutti i server, come l’identificazione, l’aggiornamento dei pacchetti, l’installazione di utili necessari e l’iscrizione del host in Zabbix per il monitoraggio di base del sistema operativo e dello stack. A seconda del gruppo di risorse, vengono assegnati ai team responsabili le chiavi di accesso appropriate. Per esempio, gli SQL Server ricevono chiavi di accesso per i server di database.

Step 6

In base al modello scelto, viene condotta la procedura di installazione e configurazione dell’intero stack. In modo simile, vengono create utenti e le credenziali vengono registrate in Vault quando necessario.

Step 7

Con l’applicazione ora in esecuzione nell’ nuova ambiente, è possibile effettuare una monitoraggio specifico per ogni stack, registrando il nuovo server in Consul. A sua volta, Prometheus identifica da dove deve raccogliere le informazioni. Ogni stack ha il suo dashboard di monitoraggio già configurato, variano solo dal nome del progetto creato.

Step 8

L’infrastruttura è consegnata al richiedente. Nel caso dei database, le credenziali sono fornite direttamente in Vault.

Struttura del progetto

La struttura delle cartelle in GitLab è organizzata come segue:

  • /infrastructure/: Il gruppo principale, dove devono essere memorizzate le variabili di ambiente globali e i valori predefiniti
  • /infrastructure/gitlab-models: Modelli di pipeline, dove abbiamo due progetti principali
    • ansible-pipelines: Un progetto dedicato alla manutenzione degli stack e alla composizione dei ruoli.

Nell’immagine sopra, vediamo un esempio di attività comuni. Nella struttura, si trova nella posizione:
/infrastructure/gitlab-models/ansible-pipelines/common-task/provision.yml

  • terraform-pipelines: Pipeline per i modelli di infrastruttura disponibili, come vSphere, KVM, AWS, ecc.

Nell’immagine sopra, abbiamo un esempio di pipeline che risiede all’interno del gruppo terraform-pipelines, come ad esempio kvm-terraform-pipeline.yml. Come possiamo vedere, è un modello GitLab CI progettato per essere esteso in un pipeline stack.

  • /infrastructure/templates: In questo gruppo, abbiamo i progetti di bootstrap, che verranno usati per creare i modelli stack.

  • /infrastructure/provision/ansible/roles: In questo progetto, abbiamo solo i ruoli Ansible, permettendoci di centralizzare e aggiornare i ruoli in un modo isolato.
  • /infrastructure/dependencies-iac: questo repository contiene le dipendenze del platform, come i file Docker per Terraform e Ansible, garantendo che le versioni delle tool e librerie necessarie non vengano alterate.
  • /infrastructure/modules/: I moduli creati per Terraform sono memorizzati in questo repository, con ogni progetto che ha la sua cartella rispettiva.
  • /infrastructure/on-premise/: Questo gruppo è dove verranno mantenute le infrastrutture create, e divise per ambienti, datacenter, stack e progetto. Nell’immagine, possiamo vedere l’hierarchy di gruppi e sotto-gruppi fino al progetto finale. A ciascuno di questi livelli, possiamo sovrascrivere i valori delle variabili associate ai gruppi.

Come Utilizzare una Piattaforma

Per semplificare l’utilizzo della piattaforma, abbiamo creato un repository chiamato issues-ops, dove forniamo un template di issue che può essere selezionato in base a specifiche necessità. In questo modo, la richiesta di infrastruttura viene registrata fin dall’inizio.

Una volta creato il problema, il team DevSecOps può iniziare a configurare l’ambiente. Per fare questo, devono semplicemente navigare fino al gruppo corretto, in questo caso, infrastructure/on-premise/staging/dc1/loadbalancer/nginx, e creare un nuovo progetto sulla base di un template. Successivamente, dovranno fornire il nome del progetto da creare e assegnare le variabili necessarie.

In ogni template, il file .gitlab-ci.yml richiesto per la creazione dell’ambiente è già configurato. Nel caso di NGINX, è impostato in questo formato.

In questa configurazione, sono incluse sia le template di creazione dell’infrastruttura che i template di Ansible, garantendo che i ruoli predefiniti siano già integrati in questi progetti. Inoltre, forniamo degli step per estendere il modello. Se sono necessari altri ruoli da installare, è sufficiente aggiungere il blocco corrispondente, permettendo un approcio modulare e costituito da blocchi per la configurazione.

Nell’immagine sottostante, vediamo il pipeline che ha eseguito la creazione dell’ambiente richiesto. Notate che authorized_keys e common sono stati eseguiti, anche se non erano stati esplicitamente dichiarati nel .gitlab-ci.yml. Questo perché abbiamo ruoli standard provenienti dal template di Ansible importato, garantendo che i ruoli predefiniti vengano applicati a tutti i progetti.

Conclusione

La piattaforma di infrastruttura ha contribuito molto alla manutenzione e all’applicazione di standard poiché richiede un modello predefinito da pianificare, testare, implementare e rendere disponibile come template prima che qualsiasi nuova infrastruttura possa essere creata. Questo processo garantisce che ogni volta che abbiamo bisogno di fornire risorse in un ambiente, stabiliamo standard coerenti, versioniamo questi ambienti e certiamo che possano essere ricostruiti con affidabilità in caso di necessità.

Uno dei principali挑战 è quello di mantenere i modelli aggiornati e validati, specialmente mentre le applicazioni si evolvono e le versioni del sistema operativo cambiano. È fondamentale ricordare che quando si utilizza l’infrastruttura come codice, tutti i cambiamenti dovrebbero essere eseguiti tramite di esso, garantendo la versionamento corretto della configurazione e l’immutabilità dell’ambiente. Non fare questo può causare la ripristinazione dell’ambiente alla sua stato definito, potenzialmente sovrascrivendo i cambiamenti manuali.

Il modello proposto in questo articolo è versatile e applicabile sia a ambienti locali che a ambienti multi-cloud, rendendolo una soluzione efficace per infrastrutture ibride.

Source:
https://dzone.com/articles/implement-an-iac-platform-with-terraform-ansible-gitlab