DevOps a felhőben Terraformmal (x)

Címkék

Hogyan használja a Terraformot a Magyar Telekom DevOps csapata nyilvános felhőben? Erről adtak elő a cég szakemberei a HWSW májusi DevOps meetupján.

A Magyar Telekom kimondottan elől jár a modern DevOps eszközök használatában, cégen belül már 2016-ban került élesbe (!) az első Docker konténeres alkalmazás, azóta pedig nagyszámú alkalmazást sikerült konténeressé alakítani - mondja a Magyar Telekom üzemeltetési szakmérnöke. "Ezek jelenleg a Telekom VMware-alapú virtualizált szerverfarmján futnak, linuxos virtuális gépeken." Ha pedig már konténeresek az alkalmazások, akkor megnyílik az út egyébként afelé, hogy ezeket publikus felhőbe (a Telekom esetében többek között az Oracle Cloudba) költöztessük. És itt jön be az előadás témája, a Terraform.

A Terraform egy Infrastructure-as-code eszköz, amellyel konfigurációs fájlban le tudjuk írni az virtuális infrastruktúrát - akár a teljes géptermet, ha igényünk van rá. Ezt tetszőleges alkalommal futtathatjuk le, a módosításokat követhetjük akár verziókezelővel, tehát sokkal-sokkal hatékonyabb, konzisztensebb megoldás, mint kézzel konfigurálni a publikus felhőt. Maga a Terraform már széles támogatásnak örvend, a nagyobb felhős szolgáltatók már támogatják, az API-t pedig rengeteg szoftvereszköz elfogadja.

De mi hajtja?

Az alap állomány a main.tf, ez írja le az erőforrásokat és azok kapcsolatait. A különböző környezeti változókat külön állományok tartalmazzák (például variables.tf, hogy ez ne zavarjon be a fő dokumentumban - ilyenek például a bejelentkezési paraméterek (felhasználónév-jelszó párosok), amivel hozzáférünk a publikus felhőhöz. Ugyanitt definiálhatjuk a a virtuális gépeinket, SSH-kulccsal és felhasználókkal.

A main.tf-re visszatérve: ez a legfontosabb konfigurációs fájl, amely a definiált erőforrásokat fogja létrehozni, függőségeivel együtt. Itt kell definiálni a virtuális gépekhez tartozó IP-címeket, biztonsági szabálycsomagot, stb. A biztonsági szabályok definiálják, hogy a gépet hogyan tudjuk elérni az internetről és a belső hálózatról. A script nem csak a megfelelő instance-et hozza létre, hanem az alkalmazást is segít beindítani (esetünkben Docker Compose-zal).

A Terraform megközelítés másik eleme az állapotot rögzítő .tfstate fájlok, amelyek tulajdonképp a rendszer lelkét képezik: ezek rendelik össze a korábban definiált és beindított erőforrásokat, párosítja össze a publikus felhőben létrejött erőforrásokat a mi hivatkozásainkkal. Ez rögzíti, hogy mely erőforrások léteznek már a rendszerben, és tudja, hogy ezeket a script új futtatásakor már nem kell újra létrehoznia. A kritikus fájlot ezért érdemes úgy tárolni, hogy biztosan elérhető és perzisztens maradjon.

A scriptek emberileg olvashatóak, de nem túl felhasználóbarátak, ha át szeretnénk tekinteni az infrastruktúrát. Ebben segít a Terraform Resource Graph és a GraphViz, amely vizualizálja az összekötött erőforrásokat és kirajzolja a létrehozott gráfot.

De mi van, ha egy erőforrást a Terraform rendszerén kívül hoztunk létre, de szeretnénk Terraformmal, automatizáltan kezelni? Erre is van megoldás, különböző importáló scriptek segítségével tudathatjuk a Terraformmal hogy milyen erőforrásaink léteznek még és vegye át azok kezelését. Az egyes erőforrásokat (például VM-eket) nekünk kell kézzel listázni, ebből pedig a rendszer generálja a már említett state fájlt.

Milyen alternatívák vannak?

A infrastruktúra-mint-kód piacon a Terraformon kívül is rengeteg népszerű szereplő van, azonban minden cég kicsit másképp fogja fel saját szerepét és máshová teszi a hangsúlyokat. A konfigurációmenedzsment vs orkesztráció osztásban a Terraform egyértelműen az utóbbi csoportot erősíti, akár nulláról képes egész infrastruktúrát létrehozni, a meglévőt pedig tovább "hangszerelni", ezért kiegészítőre, például Dockerre van szüksége a futó alkalmazások további menedzsmentjéhez.

A mutable-immutable is releváns felosztás, ebben a Terraform az immutable logikát követi, vagyis például az operációs rendszerekre nem telepít frissítéseket, hanem lekapcsolja a régit és felpörget egy új, frissített lemezképet. Ennek előnye, hogy az egyes szerverek bitre azonosak maradnak, nem alakulnak ki egyedi konfigurációk - és nem mellékesen leszoktatja az üzemeltetőket a manuális konfigurációról, hiszen azok elvesznek a következő változáskor.

Procedurális vagy deklaratív? A Chef vagy az Ansible a procedurális utat választja, vagyis azt bátorítja, hogy az üzemeltető írja le a kívánt állapothoz vezető útvonalat. Ezzel szemben a Terraform (és például a Puppet) deklaratív, tehát csupán az elérni kívánt konfigurációt kell rögzíteni, a rendszer pedig megoldja a közbenső lépéseket.

A HWSW májusi DevOps meetupján elhangzott előadás diái itt érhetőek el.

Érdekelne mindez belülről? Nézd át a Magyar Telekom állásajánlatait!

(A Magyar Telekom megbízásából készített anyag.)

Hozzászólások

Érdekelne

aha-aha-aha!

mindez belülről?

no fakin way...

--
"dolgozni mar reg nem akarok" - HZuid_7086 'iddqd' zoli berserk mode-ba kapcsol

"A Chef vagy az Ansible a procedurális utat választja, vagyis azt bátorítja, hogy az üzemeltető írja le a kívánt állapothoz vezető útvonalat. "

Valójában az Ansible nagyrészt deklaratív, pl. egy apt csomagnál név van meg state, a state az, hogy present. Az út oda, az ebből következik, attól függően, hogy fent van-e a csomag, vagy nem. Más kérdés, hogy lehet akár shell parancsot vagy bármit futtatni, de nem ez az elsődleges. A Terraform ráadásul provision részről nem is old meg semmit, azt shell scriptekkel, vagy (akár) Ansible futással lehet megoldani. Addig, amíg kész imageből gép felhúzása elég, addig jó a Terraform, azon túl már szükség van privisionre (a Terraform mellé).

A filozofia lenyege az, hogy az intrastrukturad immutable legyen, es ne keverd mutable provisioninggel. Vagy futtatsz mindent dockeren vagy hasznalhatsz cloud-configot (sajat dc eseten is pl) esetleg image-et egetsz es ha valamit valtoztatsz akkor ujrahuzod a gepet (a persistence persze mas layeren van)

"A main.tf-re visszatérve: ez a legfontosabb konfigurációs fájl, amely a definiált erőforrásokat fogja létrehozni, függőségeivel együtt. Itt kell definiálni a virtuális gépekhez tartozó IP-címeket, biztonsági szabálycsomagot, stb. A biztonsági szabályok definiálják, hogy a gépet hogyan tudjuk elérni az internetről és a belső hálózatról."

nincs olyan, hogy main.tf, nem tudom honnan veszik es legfokeppen nem abban "kell" dolgoat beallitani
nem tudom, hogy honnan vettek ezeket a hulyesegeket, max valami sajat konvenciojuk lehet :)

"A Terraform megközelítés másik eleme az állapotot rögzítő .tfstate fájlok [...] A kritikus fájlot ezért érdemes úgy tárolni, hogy biztosan elérhető és perzisztens maradjon."

nem kell tarolni semmilyen "fajlot", kiraljak smb-re vagy mi a szosz?

--
NetBSD - Simplicity is prerequisite for reliability

A main.tf amolyan konvencio amit nem kotelezo betartani, de ha megnezel random terrafom projektet altalaban igy van. (pl egy style guide https://github.com/FitnessKeeper/terraform-reference/wiki/Terraform-Sty…)

A tfstate fileokat pedig tarolni kell, mert az tartalmazza a letrehozott resource-ok allapotat. Raadasul biztonsagosan mivel szenzitiv adatokat is tartalmazhat.

Megneztem a diakat es vannak benne hibas patternek:

- A terraform.tfvars-ba nem egetunk jelszavakat mivel az commitra kerul ezert erdemes ugy letrehozni, hogy foo bar baz stb ertekek legyenek benne es mindenki szepen kitolti sajat maganak a sajat gepen (vagy CDn) az ertekeket.
- A main.tfbe nem rakunk variable-oket, erre van a variables.tf