Terraform modulok

Terraform Modulok



Az infrastruktúra kiépítése és felügyelete terén a Terraform népszerű választás a fejlesztők és az üzemeltetési csapatok körében. Deklaratív szintaxisával (HCL – HashiCorp Configuration Language) és különféle infrastruktúra-szolgáltatók támogatásával a Terraform lehetővé teszi az infrastruktúra kódként (IaC) gyakorlatát.

Az egyik legfontosabb jellemzője a modulok használata, amelyek lehetővé teszik a moduláris infrastruktúra kód létrehozását és újrafelhasználását. Ebben a cikkben megvizsgáljuk a Terraform modulok koncepcióját, és azt, hogyan segíthetik az infrastruktúra kódjának rendszerezését és egyszerűsítését.







Bevezetés a Terraform modulokba

A Terraform modulok a Terraform konfigurációk önálló csomagjai, amelyek meghatározott bemeneti és kimeneti változókkal rendelkező erőforráskészletet képviselnek. Módot biztosítanak az infrastruktúra kód beágyazására és újrafelhasználására, ami megkönnyíti az összetett infrastruktúra-telepítések kezelését és karbantartását.



A modulok létrehozhatók és használhatók egy projekten belül, vagy megoszthatók több projekt vagy csapat között.



A modul felépítése

A Terraform modulok rendszerezésekor gyakori a hierarchikus struktúra, amely gyökér- és gyermekmodulokból áll. Nézzük meg, hogyan működik ez a szervezet.





Gyökér modul



A gyökérmodul a Terraform konfigurációnk legfelső szintű modulja. Ez a belépési pont az átfogó infrastruktúra meghatározásához és a különböző erőforrások közötti kapcsolatok kezeléséhez.

A gyökérmodul jellemzően a „main.tf” fájlt tartalmazza, amelyben meghatározzuk az infrastruktúránk alapját képező erőforrásokat és konfigurációkat. Opcionálisan rendelkezhetünk vele a „variables.tf” és „outputs.tf” fájlokkal. Ezenkívül meghatározhatjuk a „modules” könyvtárunkat a gyökérkönyvtárban, hogy könnyen elérjük a gyermekmodulokat.

Gyermek modulok

A gyermekmodulok olyan moduláris összetevők, amelyek meghatározott erőforrás- vagy konfigurációkészleteket foglalnak magukba. Úgy tervezték, hogy újrafelhasználhatók legyenek, és az infrastruktúra funkcióinak önálló egységeit képviselik.

A gyermekmodulok a gyökérben vagy más alárendelt modulokban használhatók, amelyek lehetővé teszik a kompozíciót és az összetett infrastruktúra kiépítését. Minden gyermekmodulnak általában megvan a maga könyvtára, amely tartalmazza a szükséges konfigurációs fájlokat, például a „main.tf”, „variables.tf” és „outputs.tf” fájlokat.

Most nézzük meg, hogyan hozhatunk létre egy Terraform modult.

Terraform modul létrehozása

A Terraform modulok létrehozásakor új könyvtárat kell készítenünk a modulhoz a szükséges Terraform konfigurációs fájlokkal. Általában ennek a könyvtárnak a neve „modules”. A legjobb gyakorlat, ha projektünk gyökérkönyvtárában határozzuk meg.

Vegyünk egy egyszerű példát egy egyszerű modulra, amellyel helyi webszervert biztosítanak a Docker segítségével. Először a „modules” könyvtárban lévő modult „main.tf”-ként határozzuk meg.

forrás 'docker_container' 'web szerver' {
név  = var.name
kép = var.image
portok {
belső = var.belső_port
külső = var.external_port
}
}

Itt létrehozunk egy „docker_container” nevű modult, amely a tároló nevét, a Docker-képet, a belső portot és a külső portot veszi be bemeneti változóként. A modul magába foglalja a Docker-tároló-erőforrás létrehozásának logikáját, és lehetővé teszi a hívó számára a tároló tulajdonságainak testreszabását.

A következő képen látható módon létrehozunk egy külön fájlt „variables.tf” néven a „modules” könyvtárban, hogy meghatározzuk a modul használatakor testreszabható bemeneti változókat:

változó 'név' {
leírás = 'Docker-tároló neve'
típus = string
}

változó 'kép' {
leírás = 'Dokker kép'
típus = string
}

változó 'belső_port' {
leírás = 'Belső port a Docker konténeren'
típus = szám
}

változó 'külső_port' {
leírás = 'Külső port a hozzárendeléshez'
típus = szám
}

Itt négy változót deklaráltunk, mindegyik „leírás” és „típus” attribútumokkal és releváns értékekkel.

Terraform modul használata

Mióta létrehoztuk a modulunkat, mostantól a fő Terraform konfigurációban is használhatjuk a forrásra való hivatkozással. Készítsük el a fő konfigurációs fájlunkat, amely a „main.tf” a gyökérkönyvtárban.

modul 'webszerver_tároló' {
forrás = '../modules/docker_container'
név            = 'webszerverem'
kép           = 'nginx:legújabb'
belső_port   = 80
külső_port   = 8080
}

Az előző kód „modul” blokkját használjuk a Docker konténermodul példányosításához. Megadjuk a szükséges bemeneti értékeket a modulhoz, például a tároló nevét, a Docker-képet és a portkonfigurációt. A „source” paraméter a „modul” könyvtár relatív elérési útját adja meg.

Ezután nézzük meg, hogyan használhatjuk a Terraform kimeneteket a modulokhoz.

Modul kimenetek

A Terraform modul kimenetei lehetőséget biztosítanak bizonyos értékek megjelenítésére a modulon belül, így elérhetővé téve azokat a fő konfigurációban vagy más modulok általi használatra. Kommunikációs csatornaként szolgálnak a modul és a hívó fél között, amely lehetővé teszi a modul számára, hogy olyan információkat vagy adatokat biztosítson, amelyek hasznosak vagy szükségesek lehetnek a további konfigurációhoz vagy döntéshozatalhoz.

Kimenet 'container_id' {
leírás = 'A létrehozott Docker-tároló azonosítója'
érték       = docker_container.webserver.id
}

Itt létrehoztunk egy „outputs.tf” fájlt a „modules” könyvtárban. Ez a kimeneti változó felfedi annak a Docker-tárolónak az azonosítóját, amelyet a „webserver” nevű „docker_container” erőforrás hozott létre a modulon belül.

Most már elérhetjük a tárolóazonosítót a gyökér konfigurációs fájlunkban. Tekintse meg a „main.tf” fájl következő frissített kódját a gyökérkönyvtárban:

modult 'webszerver_tároló' {
forrás = '../modules/docker_container'
név            = 'webszerverem'
kép           = 'nginx:legújabb'
belső_port   = 80
külső_port   = 8080
}

forrás 'docker_volume' 'adat' {
# A többi érv ide tartozik
kötni = module.webserver_container.container_id
}

Ha a „module.webserver_container.container_id” értéket használja a „bind” argumentumhoz, arra utasítjuk a Terraformot, hogy kösse a Docker-kötetet a „web_container” modul tárolóazonosítója által megadott helyre. Ez kapcsolatot létesít a Docker-kötet-erőforrás és a „webserver_container” modul által létrehozott tároló között, biztosítva, hogy a kötet a megfelelő helyre legyen csatlakoztatva.

Terraform modulok legjobb gyakorlatai

Moduláris az újrafelhasználhatóság érdekében

A modulok tervezésénél figyelembe kell venni az újrafelhasználhatóságot. Ezenkívül azonosítanunk kell infrastruktúránk logikai összetevőit vagy mintáit, és külön modulokba kell foglalnunk őket. Ez elősegíti a kód újrafelhasználását, a szabványosítást és a csapatok közötti könnyebb együttműködést.

Világos és következetes elnevezés

A modulok, változók és erőforrások egyértelmű és következetes elnevezési konvencióinak használata javítja a kódbázis olvashatóságát és megértését, ami megkönnyíti mások számára a modulokkal való munkát és karbantartást.

Függőségek elkülönítése

Kerülnünk kell a modulok közötti szoros csatolást. Minden modulnak tartalmaznia kell saját erőforrásait és függőségeit. Ez biztosítja, hogy a modulok egymástól függetlenül újra felhasználhatók legyenek, és elősegíti a jobb izolálást és tokozást.

Verziófelügyelet és modulnyilvántartás

Moduljainkat közzétehetjük verzióvezérelt tárolóban vagy modulnyilvántartásban. Ez egy központi helyet biztosít a modulok megosztásához és felfedezéséhez, biztosítva az egyszerű hozzáférést és verziószámítást.

Következtetés

Röviden bemutattuk a Terraform modulokat, és egy egyszerű példán keresztül megtanultuk, hogyan lehet létrehozni őket. Ezután megvizsgáltuk, hogyan használhatjuk a változókat és a kimeneteket a modulunkkal, hogy fokozzuk annak rugalmasságát, újrafelhasználhatóságát és karbantarthatóságát. Összefoglalva, a Terraform modulok hatékony eszközök az infrastruktúra kódjának rendszerezésére és egyszerűsítésére. Lehetővé teszik számunkra, hogy egy sor erőforrást vagy konfigurációt újrafelhasználható komponensekbe foglaljunk, elősegítve a modularitást, az újrafelhasználhatóságot és az együttműködést az infrastruktúra-as-code projektjeinkben.