Sono anche in uno stato di migrazione dell'infrastruttura AWS esistente a Terraform, quindi cercherò di aggiornare la risposta durante lo sviluppo.
Ho fatto molto affidamento sugli esempi ufficiali di Terraform e su molteplici tentativi ed errori per rimpolpare aree in cui ero incerto.
.tfstate
File
La configurazione di Terraform può essere utilizzata per eseguire il provisioning di molte scatole su infrastrutture diverse, ognuna delle quali potrebbe avere uno stato diverso. Poiché può essere eseguito anche da più persone, questo stato dovrebbe trovarsi in una posizione centralizzata (come S3) ma non in git.
Questo può essere confermato guardando la Terraform .gitignore
.
Controllo dello sviluppatore
Il nostro scopo è fornire un maggiore controllo dell'infrastruttura agli sviluppatori mantenendo un controllo completo (log git) e la capacità di controllare l'integrità delle modifiche (richieste pull). Con questo in mente, il nuovo flusso di lavoro dell'infrastruttura a cui sto mirando è:
- Base di base di AMI comuni che includono moduli riutilizzabili, ad esempio fantoccio.
- Infrastruttura principale fornita da DevOps utilizzando Terraform.
- Gli sviluppatori modificano la configurazione di Terraform in Git secondo necessità (numero di istanze; nuovo VPC; aggiunta di regione / zona di disponibilità ecc.).
- Configurazione di Git inviata e richiesta di pull inviata per essere verificata da un membro della squadra DevOps.
- Se approvato, chiama il webhook a CI per creare e distribuire (non è sicuro come partizionare più ambienti in questo momento)
Modifica 1 - Aggiorna allo stato attuale
Da quando ho iniziato questa risposta ho scritto molto codice TF e mi sento più a mio agio nel nostro stato di cose. Abbiamo riscontrato bug e restrizioni lungo il percorso, ma accetto che questa sia una caratteristica dell'utilizzo di software nuovo e in rapida evoluzione.
disposizione
Abbiamo una complessa infrastruttura AWS con più VPC, ciascuno con più sottoreti. La chiave per gestirlo facilmente è stata definire una tassonomia flessibile che comprenda regione, ambiente, servizio e proprietario che possiamo utilizzare per organizzare il nostro codice infrastrutturale (sia terraform che fantoccio).
moduli
Il passo successivo è stato creare un unico repository git per memorizzare i nostri moduli terraform. La nostra struttura dir di primo livello per i moduli è simile a questa:
tree -L 1 .
Risultato:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
Ognuno imposta alcuni valori predefiniti sani, ma li espone come variabili che possono essere sovrascritte dalla nostra "colla".
Colla
Abbiamo un secondo repository con il nostro glue
che utilizza i moduli sopra menzionati. È strutturato in linea con il nostro documento di tassonomia:
.
├── README.md
├── clientA
│ ├── eu-west-1
│ │ └── dev
│ └── us-east-1
│ └── dev
├── clientB
│ ├── eu-west-1
│ │ ├── dev
│ │ ├── ec2-keys.tf
│ │ ├── prod
│ │ └── terraform.tfstate
│ ├── iam.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
└── clientC
├── eu-west-1
│ ├── aws.tf
│ ├── dev
│ ├── iam-roles.tf
│ ├── ec2-keys.tf
│ ├── prod
│ ├── stg
│ └── terraform.tfstate
└── iam.tf
All'interno del livello client abbiamo .tf
file specifici dell'account AWS che forniscono risorse globali (come i ruoli IAM); il prossimo è il livello regionale con le chiavi pubbliche EC2 SSH; Finalmente nel nostro ambiente ( dev
, stg
, prod
ecc) sono il nostro setup VPC, creazione dell'istanza e scrutando le connessioni ecc, sono memorizzati.
Nota a margine: come puoi vedere, vado contro il mio stesso consiglio di mantenere terraform.tfstate
in git. Questa è una misura temporanea fino al passaggio a S3, ma mi va bene perché sono attualmente l'unico sviluppatore.
Prossimi passi
Questo è ancora un processo manuale e non in Jenkins ancora, ma stiamo portando un'infrastruttura piuttosto grande e complicata e finora tutto bene. Come ho detto, pochi bug ma stanno andando bene!
Modifica 2 - Modifiche
È passato quasi un anno da quando ho scritto questa risposta iniziale e lo stato sia di Terraform che di me è cambiato in modo significativo. Ora sono in una nuova posizione che utilizza Terraform per gestire un cluster Azure e Terraform lo è ora v0.10.7
.
Stato
Le persone mi hanno ripetutamente detto che lo stato non dovrebbe andare in Git - e hanno ragione. Lo abbiamo utilizzato come misura provvisoria con un team di due persone che faceva affidamento sulla comunicazione e sulla disciplina degli sviluppatori. Con un team più ampio e distribuito, ora stiamo sfruttando appieno lo stato remoto in S3 con il blocco fornito da DynamoDB. Idealmente questo verrà migrato a console ora che è v1.0 per tagliare i provider di cloud incrociati.
moduli
In precedenza abbiamo creato e utilizzato moduli interni. Questo è ancora il caso, ma con l'avvento e la crescita del registro Terraform cerchiamo di usarli almeno come base.
Struttura dei file
La nuova posizione ha una tassonomia molto più semplice con solo due ambienti infx - dev
e prod
. Ognuno ha le proprie variabili e output, riutilizzando i nostri moduli creati sopra. Il remote_state
provider aiuta anche a condividere gli output delle risorse create tra gli ambienti. Il nostro scenario è costituito da sottodomini in diversi gruppi di risorse di Azure in un TLD gestito a livello globale.
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
Pianificazione
Di nuovo con le sfide extra di un team distribuito, ora salviamo sempre il nostro output del terraform plan
comando. Possiamo ispezionare e sapere cosa verrà eseguito senza il rischio di alcune modifiche tra lo stadio plan
e apply
(sebbene il blocco aiuti in questo). Ricordarsi di eliminare questo file del piano in quanto potrebbe contenere variabili "segrete" di testo semplice.
Nel complesso siamo molto soddisfatti di Terraform e continuiamo a imparare e migliorare con le nuove funzionalità aggiunte.