Module Terraform

Module Terraform



În lumea aprovizionării și gestionării infrastructurii, Terraform a apărut ca o alegere populară în rândul dezvoltatorilor și echipelor de operațiuni. Cu sintaxa sa declarativă (HCL – HashiCorp Configuration Language) și suport pentru diverși furnizori de infrastructură, Terraform permite practici de infrastructură ca cod (IaC).

Una dintre caracteristicile sale cheie este utilizarea modulelor care permit crearea și reutilizarea codului de infrastructură modulară. În acest articol, vom explora conceptul de module Terraform și modul în care acestea pot ajuta la organizarea și simplificarea codului nostru de infrastructură.







Introducere în modulele Terraform

Modulele Terraform sunt pachete autonome de configurații Terraform care reprezintă un set de resurse cu variabile de intrare și ieșire definite. Acestea oferă o modalitate de încapsulare și reutilizare a codului de infrastructură, ceea ce facilitează gestionarea și întreținerea implementărilor de infrastructură complexe.



Modulele pot fi create și utilizate intern în cadrul unui proiect sau partajate în mai multe proiecte sau echipe.



Organizarea Modulului

Când se organizează modulele Terraform, este obișnuit să existe o structură ierarhică care constă din module rădăcină și module copil. Să vedem cum funcționează această organizație.





Modulul rădăcină



Modulul rădăcină reprezintă modulul de nivel superior în configurația noastră Terraform. Este punctul de intrare pentru definirea infrastructurii generale și gestionarea relațiilor dintre diferite resurse.

Modulul rădăcină conține de obicei fișierul „main.tf” în care definim resursele și configurațiile care formează baza infrastructurii noastre. Opțional, putem avea cu el fișierele „variables.tf” și „outputs.tf”. De asemenea, putem defini directorul nostru „module” în directorul rădăcină pentru a accesa cu ușurință modulele copil.

Module pentru copii

Modulele copil sunt componente modulare care încapsulează seturi specifice de resurse sau configurații. Sunt proiectate pentru a fi reutilizabile și reprezintă unitățile autonome ale funcționalității infrastructurii.

Modulele copil pot fi utilizate în rădăcină sau în alte module copil care permit compoziția și construirea unei infrastructuri complexe. Fiecare modul copil are de obicei directorul său care conține fișierele de configurare necesare, cum ar fi „main.tf”, „variables.tf” și „outputs.tf”.

Acum, să vedem cum putem crea un modul Terraform.

Crearea unui modul Terraform

Când creăm module Terraform, trebuie să facem un nou director pentru modul cu fișierele de configurare Terraform necesare. De obicei, acel director se numește „module”. Definirea acestuia în directorul rădăcină al proiectului nostru este cea mai bună practică.

Să luăm un exemplu simplu de modul simplu pentru furnizarea unui server web local folosind Docker. Mai întâi, definim modulul din directorul „module” ca „main.tf”.

resursă 'docker_container' 'server web' {
nume  = var.nume
imagine = var.imagine
porturi {
intern = var.port_intern
extern = var.external_port
}
}

Aici, creăm un modul numit „docker_container” care ia numele containerului, imaginea Docker, portul intern și portul extern ca variabile de intrare. Modulul încapsulează logica pentru a crea o resursă container Docker și permite apelantului să personalizeze proprietățile containerului.

După cum se demonstrează în imaginea următoare, creăm un fișier separat numit „variables.tf” în directorul „module” pentru a defini variabilele de intrare care pot fi personalizate atunci când utilizați modulul:

variabil 'Nume' {
descriere = „Numele containerului Docker”
tip = șir
}

variabil 'imagine' {
descriere = „Imagine Docker”
tip = șir
}

variabil 'port_intern' {
descriere = „Port intern pe containerul Docker”
tip = număr
}

variabil 'port_extern' {
descriere = „Port extern către care să mapați”
tip = număr
}

Aici, am declarat patru variabile, fiecare cu „descriere” și „tip” drept atribute și valori relevante pentru acestea.

Utilizarea unui modul Terraform

De când am creat modulul nostru, îl putem folosi acum în configurația noastră principală Terraform, referindu-ne la sursa. Să creăm fișierul nostru principal de configurare care este „main.tf” în directorul rădăcină.

modul 'webserver_container' {
sursă = „../modules/docker_container”
nume            = 'serverul meu web'
imagine           = „nginx:latest”
port_intern   = 80
port_extern   = 8080
}

Folosim blocul „modul” din codul anterior pentru a instanția modulul container Docker. Oferim valorile de intrare necesare pentru modul, cum ar fi numele containerului, imaginea Docker și configurația portului. Parametrul „sursă” specifică calea relativă către directorul „modul”.

În continuare, să vedem cum să folosiți ieșirile Terraform pentru a le folosi cu module.

Ieșiri modul

Ieșirile modulelor din Terraform oferă o modalitate de a expune valori specifice din interiorul unui modul, făcându-le disponibile pentru utilizare în configurația principală sau de către alte module. Acestea servesc ca un canal de comunicare între modul și apelant, ceea ce permite modulului să furnizeze informații sau date care pot fi utile sau necesare pentru configurarea ulterioară sau luarea deciziilor.

ieșire „container_id” {
descriere = „ID-ul containerului Docker creat”
valoare       = docker_container.webserver.id
}

Aici, am creat un fișier „outputs.tf” în directorul „module”. Această variabilă de ieșire expune ID-ul containerului Docker care este creat de resursa „docker_container” numită „webserver” în cadrul modulului.

Acum, putem accesa ID-ul containerului din fișierul nostru de configurare rădăcină. Consultați următorul cod actualizat al fișierului „main.tf” din directorul rădăcină:

modul 'webserver_container' {
sursă = „../modules/docker_container”
nume            = 'serverul meu web'
imagine           = „nginx:latest”
port_intern   = 80
port_extern   = 8080
}

resursă 'docker_volume' 'date' {
# Restul argumentelor merg aici
lega = module.webserver_container.container_id
}

Folosind „module.webserver_container.container_id” ca valoare pentru argumentul „bind”, instruim Terraform să lege volumul Docker la locația specificată de ID-ul containerului modulului „web_container”. Aceasta stabilește o relație între resursa de volum Docker și containerul care este creat de modulul „webserver_container”, asigurându-se că volumul este montat în locația corespunzătoare.

Cele mai bune practici pentru modulele Terraform

Modularizare pentru reutilizare

Ar trebui să luăm în considerare reutilizabilitatea atunci când proiectăm modulele. De asemenea, trebuie să identificăm componentele sau modelele logice ale infrastructurii noastre și să le încapsulăm în module separate. Acest lucru promovează reutilizarea codului, standardizarea și colaborarea mai ușoară între echipe.

Denumirea clară și consecventă

Folosirea unor convenții de denumire clare și consecvente pentru module, variabile și resurse îmbunătățește lizibilitatea și înțelegerea bazei de cod, ceea ce face mai ușor pentru alții să lucreze cu modulele și să le întrețină.

Izolați dependențe

Trebuie să evităm cuplarea strânsă între module. Fiecare modul ar trebui să încapsuleze propriile resurse și dependențe. Acest lucru asigură că modulele pot fi reutilizate independent și promovează o mai bună izolare și încapsulare.

Controlul versiunilor și Registrul modulelor

Putem publica modulele noastre într-un depozit controlat de versiune sau într-un registru de module. Aceasta oferă o locație centralizată pentru partajarea și descoperirea modulelor, asigurând accesul și versiunea facil.

Concluzie

Am făcut o scurtă introducere în modulele Terraform și am învățat cum să le creăm cu un exemplu simplu. Apoi, am analizat cum să folosim variabilele și ieșirile cu modulul nostru pentru a îmbunătăți flexibilitatea, reutilizarea și mentenabilitatea acestuia. În concluzie, modulele Terraform sunt instrumente puternice de organizare și simplificare a codului de infrastructură. Ele ne permit să încapsulăm un set de resurse sau configurații în componente reutilizabile care promovează modularitatea, reutilizarea și colaborarea în cadrul proiectelor noastre de infrastructură ca cod.