Terraform moduler

Terraform Moduler



I infrastrukturforsynings- og administrationsverdenen er Terraform dukket op som et populært valg blandt udviklere og driftsteams. Med sin deklarative syntaks (HCL – HashiCorp Configuration Language) og support til forskellige infrastrukturudbydere, muliggør Terraform infrastruktur-som-kode (IaC)-praksis.

En af dens nøglefunktioner er brugen af ​​moduler, der gør det muligt at oprette og genbruge den modulære infrastrukturkode. I denne artikel vil vi udforske konceptet med Terraform-moduler, og hvordan de kan hjælpe med at organisere og forenkle vores infrastrukturkode.







Introduktion til Terraform-moduler

Terraform-moduler er selvstændige pakker med Terraform-konfigurationer, der repræsenterer et sæt ressourcer med definerede input- og outputvariabler. De giver en måde at indkapsle og genbruge infrastrukturkoden, hvilket gør styring og vedligeholdelse af komplekse infrastrukturimplementeringer nemmere.



Moduler kan oprettes og bruges internt i et projekt eller deles på tværs af flere projekter eller teams.



Organisering af modulet

Når man organiserer Terraform-modulerne, er det almindeligt at have en hierarkisk struktur, der består af rod- og underordnede moduler. Lad os undersøge, hvordan denne organisation fungerer.





Root modul



Rodmodulet repræsenterer topniveaumodulet i vores Terraform-konfiguration. Det er indgangspunktet for at definere den overordnede infrastruktur og styre forholdet mellem forskellige ressourcer.

Rodmodulet indeholder typisk filen 'main.tf', hvor vi definerer de ressourcer og konfigurationer, der danner grundlaget for vores infrastruktur. Eventuelt kan vi have filerne 'variables.tf' og 'outputs.tf' med sig. Vi kan også definere vores 'moduler'-bibliotek i rodmappen for nemt at få adgang til underordnede moduler.

Børnemoduler

Underordnede moduler er modulære komponenter, der indkapsler specifikke sæt ressourcer eller konfigurationer. De er designet til at kunne genbruges og repræsenterer de selvstændige enheder af infrastrukturfunktionalitet.

Underordnede moduler kan bruges inden for rod- eller andre underordnede moduler, som giver mulighed for sammensætning og kompleks infrastrukturopbygning. Hvert underordnede modul har typisk sin mappe, der indeholder de nødvendige konfigurationsfiler såsom 'main.tf', 'variables.tf' og 'outputs.tf'.

Lad os nu se, hvordan vi kan oprette et Terraform-modul.

Oprettelse af et Terraform-modul

Når vi opretter Terraform-moduler, skal vi lave en ny mappe til modulet med de nødvendige Terraform-konfigurationsfiler. Normalt hedder den mappe 'moduler'. Det er en god praksis at definere det i vores projekts rodmappe.

Lad os tage et nemt eksempel på et simpelt modul til at klargøre en lokal webserver ved hjælp af Docker. Først definerer vi modulet i mappen 'moduler' som 'main.tf'.

ressource 'docker_container' 'Webserver' {
navn  = var.navn
billede = var.billede
havne {
intern = var.intern_port
ekstern = var.ekstern_port
}
}

Her opretter vi et modul kaldet 'docker_container', der tager containernavnet, Docker-billedet, intern port og ekstern port som inputvariabler. Modulet indkapsler logikken for at skabe en Docker-containerressource og giver den, der ringer, mulighed for at tilpasse containerens egenskaber.

Som vist i det følgende billede opretter vi en separat fil kaldet 'variables.tf' i 'modules'-mappen for at definere de inputvariabler, der kan tilpasses, når modulet bruges:

variabel 'navn' {
beskrivelse = 'Docker containernavn'
type = streng
}

variabel 'billede' {
beskrivelse = 'Docker billede'
type = streng
}

variabel 'intern_port' {
beskrivelse = 'Intern port på Docker-containeren'
type = nummer
}

variabel 'ekstern_port' {
beskrivelse = 'Ekstern port at kortlægge til'
type = nummer
}

Her erklærede vi fire variabler, hver med 'beskrivelse' og 'type' som attributter og relevante værdier for dem.

Brug af et Terraform-modul

Siden vi oprettede vores modul, kan vi nu bruge det i vores primære Terraform-konfiguration ved at referere til dets kilde. Lad os lave vores hovedkonfigurationsfil, som er 'main.tf' i rodmappen.

modul 'webserver_container' {
kilde = '../modules/docker_container'
navn            = 'minwebserver'
billede           = 'nginx:nyeste'
intern_port   = 80
ekstern_port   = 8080
}

Vi bruger 'modul'-blokken i den forrige kode til at instansiere Docker-containermodulet. Vi leverer de nødvendige inputværdier for modulet, såsom containernavnet, Docker-billedet og portkonfigurationen. Parameteren 'kilde' angiver den relative sti til 'modul'-biblioteket.

Lad os derefter se, hvordan du bruger Terraform-output til brug med moduler.

Moduludgange

Moduludgange i Terraform giver mulighed for at eksponere specifikke værdier inde fra et modul, hvilket gør dem tilgængelige til brug i hovedkonfigurationen eller af andre moduler. De tjener som en kommunikationskanal mellem modulet og den, der ringer, hvilket gør det muligt for modulet at levere en information eller data, der kan være nyttig eller nødvendig for yderligere konfiguration eller beslutningstagning.

produktion 'container_id' {
beskrivelse = 'ID for den oprettede Docker-container'
værdi       = docker_container.webserver.id
}

Her oprettede vi en 'outputs.tf'-fil inde i 'modules'-mappen. Denne outputvariabel afslører ID'et for Docker-beholderen, der er oprettet af 'docker_container'-ressourcen med navnet 'webserver' i modulet.

Nu kan vi få adgang til container-id'et i vores rodkonfigurationsfil. Se den følgende opdaterede kode for 'main.tf'-filen i rodmappen:

modul 'webserver_container' {
kilde = '../modules/docker_container'
navn            = 'minwebserver'
billede           = 'nginx:nyeste'
intern_port   = 80
ekstern_port   = 8080
}

ressource 'docker_volumen' 'data' {
# Resten af ​​argumenterne går her
binde = modul.webserver_container.container_id
}

Ved at bruge 'module.webserver_container.container_id' som værdien for 'bind'-argumentet, instruerer vi Terraform om at binde Docker-volumenet til den placering, der er angivet af container-id'et for 'web_container'-modulet. Dette etablerer et forhold mellem Docker-volumenressourcen og containeren, der er oprettet af 'webserver_container'-modulet, hvilket sikrer, at volumen er monteret på den passende placering.

Bedste praksis for Terraform-moduler

Modulariser for genbrug

Vi bør overveje genanvendeligheden, når vi designer modulerne. Vi skal også identificere vores infrastrukturs logiske komponenter eller mønstre og indkapsle dem i separate moduler. Dette fremmer genbrug af kode, standardisering og lettere samarbejde på tværs af teams.

Klar og konsekvent navngivning

Brug af klare og konsistente navnekonventioner for moduler, variabler og ressourcer forbedrer læsbarheden og forståelsen af ​​kodebasen, hvilket gør det lettere for andre at arbejde med og vedligeholde modulerne.

Isoler afhængigheder

Vi skal undgå tæt kobling mellem moduler. Hvert modul bør indkapsle sine egne ressourcer og afhængigheder. Dette sikrer, at modulerne kan genbruges uafhængigt og fremmer bedre isolering og indkapsling.

Versionskontrol og modulregistrering

Vi kan publicere vores moduler til et versionsstyret repository eller modulregistrering. Dette giver en central placering til deling og opdagelse af moduler, hvilket sikrer nem adgang og versionering.

Konklusion

Vi tog en kort introduktion til Terraform-moduler og lærte, hvordan man opretter dem med et simpelt eksempel. Derefter kiggede vi på, hvordan man bruger variablerne og output med vores modul for at forbedre dets fleksibilitet, genbrugelighed og vedligeholdelse. Afslutningsvis er Terraform-moduler kraftfulde værktøjer til at organisere og forenkle infrastrukturkoden. De giver os mulighed for at indkapsle et sæt ressourcer eller konfigurationer i genanvendelige komponenter, der fremmer modularitet, genbrugelighed og samarbejde inden for vores infrastruktur-som-kode-projekter.