
Tundub, et Terraformi arendajad pakuvad AWS-i infrastruktuuri haldamiseks piisavalt mugavaid parimaid praktikaid. Kuid on ĂŒks nĂŒanss. Aja jooksul suureneb keskkondade arv, igas neist on omad eripĂ€rad. Peaaegu on muutunud rakenduste virn kopeerimiseks naaberriigis. Ja Terraformi kood tuleb ettevaatlikult kopeerida ja kohandada vastavalt uutele nĂ”udmistele vĂ”i teha lumeflokk.
Minu esitus on Terraformi mustrite kohta, et vÔidelda kaosetunne ja kÀsitsi rutiiniga suurtes ja pikaajalistes projektides.
Video:

Olen 40 aastat vana, 20 aastat IT valdkonnas. 12 aastat töötan ettevÔttes Ixtens. Me tegeleme e-kaubanduse arendamisega. Viis aastat olen praktiseerinud DevOpsi praktikaid.

Minu jutt kĂ€sitleb kogemust projektis ettevĂ”ttes, mille nime ma ei ĂŒtle, lĂ€htudes konfidentsiaalsuslepingust.
Slaidil olevad numbrid on esitatud, et mĂ”ista projekti ulatust. Ja kĂ”ik, mida ma edaspidi ĂŒtlen, on seotud Amazoniga.

Liitusin selle projektiga neli aastat tagasi. Ja kÔige viljakamal hetkel toimus infrastruktuuri refaktoreerimine, kuna projekt kasvas. Ja neid mustreid, mida kasutati, ei olnud enam sobivad. Arvestades kogu planeeritud projekti kasvu, tuli midagi uut vÀlja mÔelda.
AitÀh Matveile, kes rÀÀkis eile, mis Dodo Pizzas juhtus. See on see, mis meil juhtus 4 aastat tagasi.
Tulid arendajad ja hakkasid tegema infrastruktuurikoodi.
KÔige ilmsemad pÔhjused, miks see oli vajalik, olid time to market. Pidi olema nii, et DevOps meeskond ei oleks pudelikael vÀljalaskmisel. Ja lisaks kÔigele muule kasutati esimesel tasemel Terraformi ja Puppetit.

Terraform on HashiCorpi open source projekt. Ja neile, kes ĂŒldse ei tea, mis see on, jĂ€rgnevad mĂ”ned slaidid.

Infrastruktuur kui kood tÀhendab, et saame oma infrastruktuuri kirjeldada ja paluda mÔnel robotil teha nii, et saaksime need ressursid, mida oleme kirjeldanud.
NÀiteks, meil on vaja virtuaalne masin. Me kirjeldame, lisame mÔned kohustuslikud parameetrid.

PĂ€rast seda seadistame konsoolis juurdepÀÀsu Amazonile. Ja palume Terraformil plaane teha. Terraform plan ĂŒtleb: "Okei, teie ressursi jaoks saame teha selliseid asju." Ja vĂ€hemalt ĂŒks ressurss lisatakse. Ja muudatusi ei ole oodata.

Kui kĂ”ik on teie jaoks sobiv, saate kĂŒsida Terraform apply, ja Terraform loob teile instantsi ning saate oma virtuaalse masina oma pilves.

Edasi arendame meie projekti. Lisame sinna teatud muudatusi. KĂŒsime rohkem instante, lisame 53 kirje.

Ja kordame. KĂŒsime plaani. NĂ€eme, milliseid muudatusi kavandatakse. Rakendame. Nii kasvab meie infrastruktuur.
Terraform kasutab sellist asja nagu state-failid. See tĂ€hendab, et kĂ”ik muudatused, mis tehakse Amazonis, salvestatakse failis, kus iga kirjelduse jaoks, mida olete esitanud, on vastavad ressursid, mis on Amazonis loodud. Nii teab Terraform tĂ€pselt, mida muuta, kui ĂŒkski ressurss muutub.

Need state-failid olid algselt lihtsalt failid. Ja me hoidsime neid Git'is, mis oli ÀÀrmiselt ebamugav. Alati unustas keegi muudatusi commitida ja palju konflikte tekkis.
NĂŒĂŒd on vĂ”imalik kasutada tagastamist, st Terraform'ile öeldakse, millisesse bucket'isse ja missuguse vĂ”tme alla state-fail salvestada. Ja Terraform hoolitseb ise sellest, et see state-fail vĂ€lja vĂ”tta, kogu maagia teha ja tagasi panna lĂ”pliku tulemuse.

Meie infrastruktuur kasvab. Siin on meie kood. Me ei soovi enam lihtsalt virtuaalmasinat luua, vaid soovime luua testkeskkonna.

Terraform vÔimaldab luua selliseid mooduleid, st kirjeldada samu komponente mingis kaustas.

NÀiteks testimisel saab kutsuda selle mooduli ja saada sama tulemuse, nagu oleksime kÀivitanud Terraformi rakenduse moodulis. Testimiseks saab selline kood olema.

Tootmises saame saata sinna mingeid muudatusi, sest testimisel ei vaja me suuri instance, tootmises aga on suured instance vajalikud.

Ja siis naasen tagasi projekti. Ălesanne oli keeruline; infrastruktuur oli planeeritud vĂ€ga suureks. KĂ”ik kood oli kuidagi organiseerida nii, et see oleks mugav kĂ”igile: nii neile, kes tegelevad selle koodi hooldamisega, kui ka neile, kes muudatusi teevad. Planeeritud oli, et iga arendaja saab minna ja kohandada infrastruktuuri vastavalt sellele, mis on vajalik tema osa platvormist.
See on kaustade puu, mida soovitab HashiCorp, kui teil on suur projekt ja on mÔistlik jagada kogu infrastruktuur vÀiksemateks osadeks ning kirjeldada iga osa eraldi kaustas.
Ulatuslikud ressurside raamatukogud vÔimaldavad testimisel ja tootmises kutsuda ligikaudu sama.

Meie puhul see ei sobinud, kuna arendajate vĂ”i testimiseks mĂ”eldud testimine pidi olema lihtsam. Oli ebamugav jalutada kaustades ja rakendada asju Ă”iges jĂ€rjekorras ning muretseda, et aluseks tĂ”useb, ja seejĂ€rel tĂ”useb instants, mis seda baasi kasutab. SeetĂ”ttu kĂ€ivitati kogu testimine ĂŒhest kaustast. Seal kutsuti vĂ€lja samad moodulid, kuid kĂ”ik toimus ĂŒhe jooksuga.
Terraform hoolitseb kÔigi sÔltuvuste eest. Ja loob alati ressursse sellises jÀrjekorras, et saaks nÀiteks vÀrskelt loodud instantsilt IP-aadressi ja lisada selle IP-aadressi Route53 kirja.
Lisaks sellele on platvorm vĂ€ga suur. Ja testimisstacki kĂ€ivitamine, isegi kui ainult ĂŒheks tunniks, isegi kui kaheks tunniks â see on ĂŒsna kulukas ettevĂ”tmine.
Ja me automatiseerisime selle. Jenkinsi töö vÔimaldas kÀivitada steki. Seal pidi kÀivitama pull request'i koos muudatustega, mida arendaja soovib testida, mÀÀrama kÔik vajalikud valikud, komponendid ja suurused. Kui ta soovib teha jÔudlustesti, saab ta vÔtta rohkem instantsse. Kui tal on vaja lihtsalt kontrollida, et mÔni vorm avaneb, siis sai ta alustada minimaalsetest seadistustest. Samuti sai mÀÀrata, kas klaster on vajalik vÔi mitte jne.
Siis surus Jenkins shell-skripti, mis modifitseeris koodi Terraformi kaustas natuke. Eemaldas vajalikud failid, lisas vajalikud failid. Ja siis ĂŒhe kĂ€ivitusega Terraform apply tĂ”stis steki ĂŒles.
Edasi liikudes jĂ€rgnesid muud sammud, millesse ma ei soovi sĂŒveneda.

Kuna testimiseks vajasime natuke rohkem valikuid kui tootmises, pidime tegema koopiad moodulitest, et neis koopiates saaksime lisada need funktsioonid, mis on vajalikud ainult testimisel.
Nii juhtus, et testimise kĂ€igus tahame tavaliselt katsetada neid muudatusi, mis lĂ”puks jĂ”uavad tootmisse. Kuid tegelikult testiti ĂŒhte ja tootmisse rakendati natuke teist. See pĂ”hjustas vĂ€ikese mĂ”ttekao, et tootmises rakendati kĂ”ik muudatused operatsioonide meeskonna poolt. Ja mĂ”nikord juhtus, et need muudatused, mis pidid testimisest tootmisse minema, jĂ€id hoopis teise versiooni.
Lisaks oli probleemiks see, et lisandus uus teenus, mis erines veidi juba olemasolevast. Ja selle asemel, et olemasolevat moodulit muuta, tuli teha selle koopia ja lisada vajalikud muudatused.
Sisuliselt on Terraform mitte tegelik keel, vaid deklaratsioon. Kui me peame midagi deklareerima, siis me deklareerime selle. Ja kÔik see töötab.
Ăhel hetkel, kui arutati ĂŒht minu pull request'i, ĂŒtles ĂŒks kolleeg, et ei tohiks luua liialt palju lumehelbeid. Mind huvitas, mida ta selle all mĂ”tles. On olemas teaduslik fakt, et maailmas ei ole kaht ĂŒhesugust lumehelbekest, kĂ”ik need on natuke erinevad. Ja kui ma seda kuulsin, tajusin kohe Terraform'i koodi raskust. Sest kui tuli minna versioonilt versioonile, nĂ”udis Terraform katkestamise ahelate muutmist, st kood ei olnud enam jĂ€rgmise versiooniga ĂŒhilduv. Ja pidin tegema pull request'i, mis hĂ”lmas peaaegu poole infrastruktuuri failidest, et tuua infrastruktuur jĂ€rgmise Terraform'i versioonini.
Ja pÀrast seda, kui selline lumehelbekene tekkis, muutus kogu meie Terraform'i kood suureks lumekuhjaks.
VÀlimise arendaja jaoks, kes ei ole operatsioonide sesioonis, pole sel suurt tÀhtsust, kuna ta tegi pull request'i, tema ressurss kÀivitati. Ja kÔik, edasi pole see tema mure. Aga DevOps'i meeskonnale, kes hoolitseb selle eest, et kÔik oleks korras, tuleb teha need kÔik muudatused. Ja nende muudatuste maksumus suurenes iga lisalumehelbe korral.

On see selline lugu, kuidas ĂŒliĂ”pilane seminaril joonistab kriidiga tahvlile kaks ideaalset ringi. Ja Ă”petaja imestab, kuidas tal Ă”nnestus nii ĂŒhtlaselt ilma kompassita joonistada. ĂliĂ”pilane vastab: «VĂ€ga lihtne, ma keerutasin kaks aastat armees hakklihamasinat.»
Nendest neljast aastast, mil ma selles projektis osalen, olen umbes kaks aastat tegelenud Terraformiga. Ja muidugi on mul mÔned nipid, mÔned soovitused, kuidas Terraformi koodi lihtsustada, töötada sellega nagu programmeerimiskeelega ja vÀhendada koormust arendajatele, kes peavad seda koodi ajakohasena hoidma.

Esimene asi, millega soovin alustada, on Symlinkid. Terraformil on palju korduvat koodi. NĂ€iteks pakkuja kutsumine on praktiliselt igas punktis, kus me loome tĂŒkikese infrastruktuurist, sama. Seega on mĂ”istlik see eraldi kausta vĂ€lja vĂ”tta. Ja igal pool, kus on vaja pakkujat, luua sellele failile Symlinkid.

NĂ€iteks, kui teil on production'is assume role, mis vĂ”imaldab teil pÀÀseda ligi vĂ€lisele Amazon-kontole. Ja muutes ĂŒht faili, omavad kĂ”ik ĂŒlejÀÀnud, mis asuvad ressursside puus, vajalikke Ă”igusi, et Terraform teaksite, millisele Amazon-segmendile ligi pÀÀseda.

Kus Symlinks ei tööta? Nagu öeldud, on Terraformil state-failid. Ja need on vÀga-vÀga Àgedad. Kuid asi on selles, et Terraform inizialiseerib backend'i esimeses jÀrjekorras. Ja ta ei saa kasutada nende parameetrites mingeid muutujaid, need peavad alati olema kirjutatud tekstina.
Ja lÔppkokkuvÔttes, kui keegi loob uue ressursi, kopeerib ta osa koodist teistest kaustadest. Ja ta vÔib eksida vÔtme vÔi bucket'i osas. NÀiteks, kui ta teeb sandbox'st sandbox-asja ja seejÀrel teeb production'is. Ja niiviisi vÔib osutuda, et production'is kasutatakse bucket'it sandbox'ist. Loomulikult leitakse see kiiresti. Seda saab kuidagi parandada, kuid siiski aega kaotatakse ja mingil mÀÀral ressursse.

Mida me saame edasi teha? Enne Terraformiga töötamist tuleb see initsialiseerida. Initsialiseerimise hetkel laadib Terraform kÔik pluginaid alla. Need on mingil hetkel monoliitsetest teenustest muutunud rohkem mikroteenuste arhitektuuriks. Ja alati tuleb teha Terraform init, et see tÔmbaks kÔik moodulid ja pluginad alla.
VÔib kasutada shell-skripti, mis kÔigepealt suudab vÀlja tuua kÔik muutujad. Shell-skripti ei piirata millegagi. Ja teiseks, teed. Kui me kasutame alati seda teed, mis on hoidlas, kui vÔtme state-faili jaoks, siis eksimise vÔimalus on vÀlistatud.

Kust saada andmeid? JSON-failist. Terraform vÔimaldab salvestada infrastruktuuri mitte ainult hcl (HashiCorp Configuration Language) formaadis, vaid ka JSON-is.
JSON loetakse shell-skriptist lihtsalt. Seega vÔib mingisse kohta panna konfigureerimisfaili koos bucket'iga. Ja kasutada seda bucketit nii Terraformi koodis kui ka shell-skriptis initsialiseerimiseks.

Miks on oluline, et Terraformil oleks bucket? Sest on selline asi nagu remote state-failid. TĂ€hendades, kui ma kĂ€itan mĂ”nda ressurssi, pean ma Amazoni ĂŒtlemiseks: 'Palun tĂ”sta instance ĂŒles', mĂ€rkima vĂ€ga palju kohustuslikke parameetreid.
Ja need tuvastajad salvestatakse kuskile teise kausta. Ja ma vĂ”in öelda: âTerraform, palun mine ja too mulle selle ressursi state-failist need tuvastajad.â Nii tekib mingisugune ĂŒhtsus erinevate piirkondade vĂ”i keskkondade vahel.
Ei ole alati vĂ”imalik kasutada kaug-state-faili. NĂ€iteks, kui olete kĂ€sitsi loonud VPC. Ja see Terraformi kood, mis loob VPC, loob nii erineva VPC, et teil kulub kaua aega ja peate ĂŒht teise kohandama, seetĂ”ttu saab kasutada jĂ€rgmist nipi.

St. teha moodul, mis justkui loob VPC ja annab teile tuvastajad, aga tegelikult on lihtsalt fail, millel on kÔvakooditud vÀÀrtused, mida saab kasutada sama instance'i loomisel.

Ei ole alati vajalik salvestada state-faili pilves. NĂ€iteks, kui testitakse mooduleid, saab kasutada backend'i initsialiseerimist, kus fail salvestatakse lihtsalt kettale testimise ajaks.

NĂŒĂŒd rÀÀgime natuke testimisest. Mida saab Terraformis testida? TĂ”enĂ€oliselt on palju, aga ma rÀÀgin just nendest neljast asjast.
HashiCorp'il on arusaam, kuidas Terraformi koodi vormindada. Terraform fmt vÔimaldab teil vormindada koodi, mida te redigeerite, vastavalt sellele arusaamale. Seega peavad testid alati kontrollima, kas vormindamine vastab HashiCorpi loodud standarditele, et ei peaks muutma sulgude asukohta jne.

JĂ€rgmine samm on Terraform validate. See teeb veidi rohkem kui lihtsalt sĂŒntaksi kontrollimise - see kontrollib, kas kĂ”ik sulud on paaris. Mis on siin oluline? Meie infrastruktuur on vĂ€ga keeruline. Seal on vĂ€ga palju erinevaid kaustasid. Ja igas neist tuleb kĂ€ivitada Terraform validate.
Seega, et testimist kiirendada, kÀivitame korraga mitmeid protsesse, kasutades paralleelsust.
Paralleelsus on tÔeliselt Àge asi, kasutage seda.
Kuid iga kord, kui toimub Terraformi algatamine, lĂ€heb see HashiCorpi ja kĂŒsib: âMillised on viimased pluginade versioonid? Ja see plugin, mis mul on vahemĂ€lus - kas see on Ă”ige vĂ”i vale?â. Ja see andis iga sammu juures oma viivituse.

Kui Terraform annab juhiseid, kus lisandmoodulid asuvad, ĂŒtleb Terraform: "Okei, arvatavasti on see kĂ”ige vĂ€rskem, mis on. Ma ei hakka kuhugi minema, vaid alustame otse teie Terraform-koodi valideerimisega."

Selleks, et kaust vajalikest lisandmoodulitest tĂ€ita, on meil vĂ€ga lihtne Terraform-kood, mille lihtsalt tuleb initsialiseerida. Siin tuleb kindlasti mĂ€rkida kĂ”ik teenusepakkujad, kes osalevad teie koodis, muidu ĂŒtleb Terraform: "Ma ei tunne ĂŒhtegi teenusepakkujat, kuna seda ei ole vahemĂ€lus."

JĂ€rgmine on Terraform plaan. Nagu öeldud, on arendus tsĂŒkliline. Loome koodi muudatustega. SeejĂ€rel peab selguma, millised muudatused infrastruktuuri plaanitakse.
Ja kui infrastruktuur on vĂ€ga, vĂ€ga suur, vĂ”ib ĂŒhe mooduli muutmine, mingi testkeskkonna parandamine vĂ”i konkreetse regiooni muutmine kahjustada mĂ”nda naabermoodulit. SeetĂ”ttu peaks Terraform plaan olema koostatud kogu infrastruktuuri jaoks ja nĂ€itama, millised muudatused on plaanis.
Seda saab teha nutikalt. Me nÀiteks kirjutasime Pythonis skripti, mis lahendab sÔltuvused. Ja sÔltuvalt sellest, mis tÀpselt muutunud on: Terraformi moodul vÔi lihtsalt mÔni konkreetselt komponent, koostab see plaanid kÔigi sÔltuvate kaustade jaoks.
Terraformi plaanid peaksid olema toodetud nÔudmisel. vÀhemalt, nii me teeme.
Testid, muidugi, on igas muutuses ja igas commit'is head, kuid plaanid â see on piisavalt kulukas asi. Ja me pull request'is ĂŒtleme: âPalun, anna mulle plaanidâ. Robot kĂ€ivitub ja saadab kommentaaridesse vĂ”i lisanditena kĂ”ik plaanid, mis on seotud teie muudatustega.
Plaan on piisavalt kulukas. See vĂ”tab aega, kuna Terraform lĂ€heb Amazonisse ja kĂŒsib: âKas see instants on ikka olemas? Ja kas selle autoscale'i parameetrid on tĂ”esti sellised?â. Aja sÀÀstmiseks saab kasutada sellist parameetrit nagu refresh=false. See tĂ€hendab, et Terraform laadib S3-st oleku andmed. Ja usub, et olek vastab tĂ€pselt sellele, mis Amazonis on.
Selline Terraformi plaan kulgeb palju kiiremini, kuid state peab vastama teie infrastruktuurile, st kuskil ja kunagi peab Terraform refresh kÀivituma. Terraform refresh teeb just seda, et state vastaks sellele, mis on reaalses infrastruktuuris.
Ja tuleb rÀÀkida turvalisusest. Sellega oleks tulnud alustada. Seal, kus te kÀitate Terraformi ja Terraform töötab teie infrastruktuuriga, on olemas haavatavus. St te, pÔhimÔtteliselt, tÀidate koodi. Ja kui pull request sisaldab mingit pahatahtlikku koodi, vÔib see kÀivituda infrastruktuuris, millel on liiga palju ligipÀÀsu. Seega olge ettevaatlik, kus te Terraformi plaani kÀitate.

JÀrgmine, millest sooviksin rÀÀkida, on user-data testimine.
Mis on user-data? Amazonis, kui loome instanceâi, saame instanceâilt saata mingi kirja â meta-andmed. Kui instance kĂ€ivitub, on tavaliselt cloud init alati nende instanceâide juures. Cloud init loeb seda kirja ja ĂŒtleb: "Okei, tĂ€na olen ma load balancer." Ja nende andmete alusel sooritab ta teatud tegevusi.

Kahjuks, kui me teeme Terraform plaani ja Terraform rakendust, nÀeb user-data vÀlja nagu selline numbrite puder. TeisisÔnu, see saadab teile lihtsalt hash'i. Ja kÔik, mida saate plaanis vaadata, on see, kas mÔned muudatused on vÔi hash jÀÀb samaks.
Ja kui sellele mitte tÀhelepanu pöörata, vÔib Amazonis, reaalses infrastruktuuris, minna mingisugune rikutud tekstifail.

Ăhe vĂ”imalusena saab tĂ€itmise kĂ€igus nĂ€idata mitte kogu infrastruktuuri, vaid ainult template'i. Ja koodis saate öelda: "Palun, nĂ€ita mulle seda template'i." Nii et lĂ”puks saate vĂ€lja printida, millised teie andmed Amazonis vĂ€lja nĂ€evad.

Teine vĂ”imalus on kasutada moodulit user-data genereerimiseks. Te rakendate selle mooduli. Saate faili kettale. VĂ”rdlete seda lĂ€htefailiga. Ja nii, kui mĂ”ni algaja otsustab user-data veidi muuta, ĂŒtlevad teie testid: "Ok, siin ja siin on mingid muudatused â see on normaalne."

JÀrgmiseks, millest ma rÀÀkida tahan, on Automate Terraform rakendus.
Muidugi on hirmutav Terraformi rakendamine automaatselt, sest kes teab, millised muudatused on tehtud ja kui kahjulikud need vÔivad olla elavale infrastruktuurile.
Testkeskkonna jaoks on see kĂ”ik tĂ€iesti normaalne. See tĂ€hendab, et töö, mis loob testkeskkonna, on see, mida kĂ”ik arendajad vajavad. Ja selline vĂ€ljend nagu âmul töötas kĂ”ikâ ei ole naljakas meem, vaid tĂ”estus sellest, et inimene on vaeva nĂ€inud, kĂ€ivitanud virna, jooksutanud sellel mingi teste. Ja veendunud, et kĂ”ik on korras ning öelnud: âOk, see kood, mille ma vĂ€lja annan, on testitud.â
Tootmises, liivakastis ja teistes keskkondades, mis on ettevÔtte jaoks olulisemad, vÔib osaliselt rakendada mÔned ressursid piisavalt turvaliselt, kuna see ei pÔhjusta, et keegi surma saab. Need on: autoscale-grupid, turvagrupid, rollid, Route53 ja seal vÔib olla piisavalt pikk nimekiri. Kuid jÀlgige, mis toimub, lugege automatiseeritud rakendamise aruandeid.
Kohas, kus rakendamine on ohtlik vĂ”i hirmutav, nĂ€iteks kui tegemist on pĂŒsivate ressursidega, andmebaasidega, siis saate aruandeid selle kohta, et mĂ”nes infrastruktuuri osas on rakendamata muudatused. Ja insener kĂ€ivitab jĂ€lgimise all tööd, et neid rakendada vĂ”i teeb seda oma konsoolist.
Amazonis on selline asi nagu Terminate protection. See vĂ”ib mĂ”nel juhul kaitsta teid soovimatute muudatuste eest. St. Terraform lĂ€heb Amazonisse ja ĂŒtleb: "Mul on vaja see instants kustutada, et teha teine kindel instants." Amazon aga vastab: "Sorry, ei tĂ€na. Meil on Terminate protection sisse lĂŒlitatud."

Ja koogitĂŒkk â see on koodi optimeerimine. Kui töötame Terraform-koodiga, peame moodulisse edastama vĂ€ga suure hulga parameetreid. Need parameetrid on vajalikud, et luua mĂ”ni ressurss. Ja kood muutub suurteks parameetrite loenditeks, mida tuleb edastada moodulist moodulisse, eriti kui moodulid on pesastatud.
Ja see on vĂ€ga raske lugeda. Seda on vĂ€ga raske ĂŒle vaadata. Ja tihti juhtub, et mĂ”ned parameetrid lĂ€bivad ĂŒlevaatamise, kuid nad ei ole just need, mis vajalikud. Ja see maksab aega ja raha, et hiljem parandada.

SeetÔttu soovitan teil kasutada sellist asja nagu keeruline parameeter, mis sisaldab mingit vÀÀrtuste puu. St. on vaja mingit kausta, kus on loetletud kÔik vÀÀrtused, mida sooviksite mingis keskkonnas omada.

Ja kutsudes seda moodulit, saab genereerida puu, mis luuakse ĂŒhes ĂŒldises moodulis, st. ĂŒldises moodulis, mis töötab ĂŒhtlaselt kogu infrastruktuuris.
Selles moodulis saab teha teatud arvutusi, kasutades sellist uut funktsiooni Terraformis nagu locals. Ja siis ĂŒhe vĂ€ljundiga anda vĂ€lja mingi keeruline parameeter, mis vĂ”ib sisaldada hash'e, massiive jne.

Siin on kĂ”ik parimad leidud, mis mul on. Tahaksin rÀÀkida loo Kolumbusest. Kui ta otsis raha oma ekspeditsioonile, et avastada Indiat (nagu ta arvas), ei uskunud keegi temasse ega pidanud seda vĂ”imalikuks. Siis ĂŒtles ta: "Tehke nii, et muna ei kukuks." KĂ”ik pangandajad, vĂ€ga rikkad ja tĂ”enĂ€oliselt arukad inimesed, proovisid muna kuidagi pĂŒstise hoida, kuid see kukkus pidevalt. Siis vĂ”ttis Kolumbus muna, surus sellele veidi. Koor vajus sisse ja muna jĂ€i liikumatuks. Nemad ĂŒtlesid: "Oh, see on liiga lihtne!". Ja Kolumbus vastas: "Jah, see on liiga lihtne. Ja kui ma avastan India, hakkavad kĂ”ik seda kaubateed kasutama."
Ja see, mis ma teile just rÀÀkisin, on tÔenÀoliselt piisavalt lihtsad ja triviaalne asjad. Ja kui sa neist kuulema saad ja hakkad neid kasutama, on see igati normaalne. Nii et kasutage neid. Ja kui need on teie jaoks tÀiesti tavalised asjad, siis vÀhemalt teate, kuidas muna paigal hoida, et see ei kukuks.

KokkuvÔtteks:
- PĂŒĂŒdke lumepalle vĂ€ltida. Ja mida vĂ€hem lumepalle, seda vĂ€hem ressursse on teil vaja, et teha muudatusi kogu teie suurel infrastruktuuril.
- PĂŒsivad muudatused. See tĂ€hendab, et kui koodis on toimunud muudatusi, tuleb vĂ”imalikult kiiresti viia teie infrastruktuur vastavusse nende muudatustega. Ei peaks olema olukorda, kus keegi tuleb kaks-kolm kuud hiljem vaatama Elasticsearchi, teeb Terraform plaani ja seal on palju muudatusi, mida ta ei oodanud. See vĂ”tab palju aega, et kĂ”ik uuesti korda seada.
- Testid ja automatiseerimine. Mida rohkem on teie kood kaetud testide ja funktsioonidega, seda kindlamad olete, et teete kÔike Ôigesti. Automaatne edastamine suurendab teie enesekindlust mitu korda.
- Testimise ja tootmisĂŒmbritsioonide kood peab olema praktiliselt sama. Praktiliselt, sest tootmine on ikkagi natuke erinev ja seal on ikkagi mĂ”ned nĂŒansid, mis jÀÀvad testimisest vĂ€lja. Kuid siiski, pluss-miinus saab seda tagada.
- Ja kui teil on vÀga palju Terraform-koodi ja selle koodi ajakohasena hoidmiseks kulub palju aega, pole kunagi liiga hilja refaktoreerida ja see heasse vormi tuua.

- Muudatusteta infrastruktuur. AMI tarnimine graafiku jÀrgi.
- Struktuur route53 jaoks, kui teil on palju kirjeid ja soovite, et need oleksid korrektses jÀrjestuses.
- API mÀÀrangute piirangute ĂŒletamine. See on siis, kui Amazon ĂŒtleb: "KĂ”ik, piisab, ma ei saa enam pĂ€ringuid vastu vĂ”tta, palun oodake." Ja pool kontorist ootab, kuni nad saavad oma infrastruktuuri kĂ€ivitada.
- Spot instance'id. Amazon ei ole odav lahendus ja spot'id aitavad palju sÀÀsta. Sel teemal vÔiks esitleda terve ettekande.
- Turvalisus ja IAM rollid.
- Kadunud ressursside otsimine, kui Amazonis on arusaamatute pĂ€ritoluga instance'id, mis söövad raha. Isegi kui instance maksab 100-150 dollarit kuus â aastas on see ĂŒle 1000. Selliste ressursside leidmine on kasumlik Ă€ri.
- Ja reserveeritud instance'id.

Sellega ongi kÔik. Terraform on vÀga Àge, kasutage seda. AitÀh!
KĂŒsimused
AitĂ€h ettekande eest! Teil on state-fail S3-s, kuid kuidas te lahendate probleemi, et mitu inimest saavad selle state-faili ja pĂŒĂŒavad kasutusele vĂ”tta?
Esiteks, me ei kiirusta. Teiseks, meil on flags, millega teavitame, et töötame mingis koodijupil. See tĂ€hendab, et kuigi infrastruktuur on vĂ€ga suur, ei tĂ€henda see, et keegi pidevalt midagi rakendab. Ja kui aktiivne faas oli â oli see probleem, meil olid state-failid Git'is. See oli oluline, muidu keegi teeks state-faili ja pidime need kĂ€sitsi kokku koguma, et kĂ”ik jĂ€tkuks. Praegu sellist probleemi ei ole. Ăldiselt lahendas Terraform selle ĂŒlesande. Ja kui pidevalt midagi muutub, siis saab kasutada lukke, mis takistavad seda, mida te ĂŒtlesite.
Kasutate te avatud versiooni vÔi ettevÔtte versiooni?
Mitte mingit ettevÔtte versiooni, st kÔik, mida saab tasuta alla laadida.
Minu nimi on Stanislav. Soovisin teha vÀikese tÀienduse. Te rÀÀkisite Amazon'i funktsioonist, mis vÔimaldab luua mittehÀvitatavat instantsi. See on olemas ka Terraformis, Life Second bloki sees saab mÀrkida muudatuste vÔi hÀvitamise tÔkestamise.
Aeg oli piiratud. Hea mÀrkamine.
Soovisin veel kĂŒsida kahte asja. Esiteks rÀÀkisite testimisest. Kas olete kasutanud mingeid teste teenuseid? Olen kuulnud Test Kitchen pluginast. VĂ”ib-olla on veel midagi. Ja tahaksin veel kĂŒsida Local Values kohta. Kuidas need pĂ”himĂ”tteliselt erinevad Input Variables'ist? Ja miks ma ei saa midagi ainult Local Values kaudu parameteriseerida? Olen proovinud selle teema kallal töötada, kuid ei ole sellega pĂ€ris selgeks saanud.
Saame sellest ruumist pĂ”hjalikumalt rÀÀkida. Testimisriistade osas on meil tĂ€iesti omavalmistatud lahendused. Seal ei ole midagi sellist, mida saaks testida. Kuid ĂŒldiselt on vĂ”imalusi, kus automaatsed testid loovad infrastruktuuri kusagil, kontrollivad, et see oleks korras, ja siis kĂ”ik hĂ€vitatakse koos raportiga, et teie infrastruktuur on endiselt heas seisukorras. Meil seda ei ole, sest testimine toimub igapĂ€evaselt. Ja see piisab. Ja kui midagi hakkab katki minema, siis see hakkab katki minema, ilma et me peaksime seda kuskil veel kontrollima.
Local Values'i osas jÀtkame vestlust ruumis.
Tere! AitĂ€h ettekande eest! See oli vĂ€ga informatiivne. Sa ĂŒtlesid, et teil on vĂ€ga palju sarnast koodi infrastruktuuri kirjeldamiseks. Kas te ei ole kaalunud koodi genereerimise vĂ”imalust?
SuurepĂ€rane kĂŒsimus, aitĂ€h! Asi on selles, et kui me kasutame infrastruktuuri kui koodi, eeldame, et vaatame koodi ja mĂ”istame, milline infrastruktuur selle koodi taga seisab. Kui kood genereeritakse, peame ette kujutama, milline kood genereeritakse, et mĂ”ista, milline infrastruktuur seal on. Kas genereerime koodi, paneme selle edasi ja esimese mĂ”ttega saame samu tulemusi. SeetĂ”ttu lĂ€ksime teed, nagu oleme kirjutanud, ja said, mida said. Pluss genereerijad tulid mĂ”ned aega hiljem, kui olime alustanud. Ja oli juba liiga hilja seda muuta.
Kas oled kuulnud jsonnetist?
Ei.
Vaata, see on tÔeliselt Àge asi. Ma nÀen konkreetset kasutusjuhtu, kus seda saab rakendada ja andmestruktuure genereerida.
Generaatorid on head, kui sul on nagu anekdootis habemeajamismasinast. Ehk siis esmakordselt on nĂ€od erinevad, kuid hiljem on kĂ”igil nĂ€od ĂŒhesugused. Generaatorid on tĂ”eliselt head. Kuid meil on kahjuks nĂ€od veidi erinevad. See on probleem.
Lihtsalt vaata. AitÀh!
Minu nimi on Maksim, ma olen Sberbankist. Te rÀÀkisite veidi sellest, et ĂŒritasite Terraformit programmeerimiskeele analoogiks tuua. Kas poleks lihtsam kasutada Ansible'i?
Need on vÀga erinevad asjad. Ka Ansible'i abil saab luua ressursse ja Puppetiga saab ressursse Amazonis luua. Kuid Terraform on sellele spetsialiseerunud.
Kas teil on ainult Amazon?
KĂŒsimus ei ole selles, et meil on ainult Amazon. Meil on peaaegu ainult Amazon. Kuid vĂ”tmekĂŒsimus on selles, et Terraform mĂ€letab. Ansible'iga, kui ĂŒtled: âTĂ”sta mulle 5 instantsiâ, siis ta tĂ”stab need ĂŒles, aga pĂ€rast ĂŒtled: âNĂŒĂŒd on mul vaja 3â. Terraform ĂŒtleb: âOkei, tapen 2â, aga Ansible ĂŒtleb: âOkei, siin on 3â. Kokku 8.
Tere! AitÀh teie ettekande eest! Oli vÀga huvitav kuulda Terraformist. Tahaksin kohe anda vÀikse kommentaari selle kohta, et Terraformil ei ole siiski stabiilset versiooni, seega suhelge Terraformiga vÀga ettevaatlikult.
Hea lusikas supi jaoks. Ehkki, kui vajate lahendust, siis mĂ”nikord lĂŒkkate edasi ebastabiilse jne, kuid see töötab ja on meile abiks olnud.
KĂŒsimus on selline. Kas te kasutate Remote backend'i, kasutate S3-d. Miks te ei kasuta ametlikku backend'i?
Ametlik?
Terraform Cloud.
Millal see ilmus?
Neli kuud tagasi.
Kui ta oleks ilmunud neli aastat tagasi, oleksin ma ilmselt teie kĂŒsimusele vastanud.
Seal on juba sisse ehitatud funktsioon, mis vÔimaldab kasutada lukke ja hoida olekufaili. Proovige. Kuid ma ei ole seda ka testinud.
Reisime suures rongis, mis liigub suure kiirusel. Ja ei saa lihtsalt vÔtta ja visata Àra mitut vagunit.
Te rÀÀkisite lumehelvestest, aga miks te ei kasutanud haru? Miks ei Ônnestunud nii teha?
Meie lĂ€henemine on selline, et kogu infrastruktuur on ĂŒhes hoidlas. Terraform, Puppet, kĂ”ik skriptid, mis isegi mingil viisil selle juurde kuuluvad, on kĂ”ik ĂŒhes hoidlas. Nii saame tagada, et jĂ€rkjĂ€rgulised muudatused on ĂŒksteise jĂ€rel testitud. Kui see oleks hulk harusid, oleks sellist projekti praktiliselt vĂ”imatu hooldada. Aastad möödub ja need tĂ”ukuvad nii kaugele, et see on nagu karistus. See on see, millest tahaks enne refaktooringut pĂ”geneda.
See tÀhendab, et see ei tööta?
See ei tööta ĂŒldse.
Branchis lĂ”ikasin kaustade slaidi. See tĂ€hendab, et kui teha iga testplexi jaoks, nĂ€iteks A meeskonna jaoks â neil on oma kaust, B meeskonna jaoks oma kaust, siis see ei toimi ka. Me tegime ĂŒhtse testkeskkonna koodi, mis oli piisavalt paindlik, et sobida kĂ”igile. See tĂ€hendab, et me hooldasime ĂŒhtset koodi.
Tere! Minu nimi on Jura! AitĂ€h ettekande eest! KĂŒsimus moodulite kohta. Te ĂŒtlete, et kasutate mooduleid. Kuidas te lahendate probleemi, kui ĂŒhes moodulis tehti muudatusi, mis ei ĂŒhildu kellegi teise muudatustega? Kas te versioonite mooduleid vĂ”i ĂŒritate kuidagi heilida, et vastata kahele nĂ”udmisele?
See on suure lume kuhja probleem. See on see, millega me kannatame, kui mingi sĂŒĂŒtu muudatus vĂ”ib rikku teatud infrastruktur. Ja seda mĂ€rgatakse ainult pĂ€rast pikka aega.
Kas see tÀhendab, et praegu ei ole lahendust?
Teete universaalsed moodulid. VÀltige lumehelbeid. Ja kÔik lÀheb korda. Ettekanne teine pool rÀÀgib, kuidas seda vÀltida.
Tere! AitĂ€h ettekande eest! Sooviksin tĂ€psustada. KĂŒll on palju jÀÀnud, mille pĂ€rast ma tulin. Kuidas on integreeritud Puppet ja rollide jaotamine?
Kasutaja andmed.
T. e. lihtsalt viskate faili vÀlja ja siis töötlete seda kuidagi?
Kasutaja andmed â see on mĂ€rk, st kui me teeme pildi klooni, siis kĂ€ivitub Daemon, kes pĂŒĂŒab vĂ€lja selgitada, kes ta on, ja loeb mĂ€rkuse, et ta on koormustasakaalustaja.
T. e. see on mingi eraldi protsess, mis antakse edasi?
Me ei leiutanud seda. Me kasutame seda.
Tere! Mul on just kĂŒsimus kasutaja andmete kohta. Te ĂŒtlesite, et seal on probleeme, et keegi vĂ”ib midagi valesti edastada. Kas on mingit vĂ”imalust salvestada kasutaja andmed samasse Git'i, et oleks alati aru saada, millele kasutaja andmed viitavad?
User-data genereeritakse ĆĄablonist. See tĂ€hendab, et seal on mingi hulk muutujaid. Ja Terraform genereerib lĂ”pptulemuse. SeetĂ”ttu ei saa lihtsalt vaadata ĆĄabloni ja öelda, mis tuleb, sest kĂ”ik probleemid on seotud sellega, et arendaja arvab, et ta edastab selles muutuja sees rea, aga seal tuleb massiiv. Ja tal on - hopp, kes see on, kes see on, jĂ€rgmine rida, ja kĂ”ik on katki. Kui see on uus ressurss ja inimene tĂ”stab selle ĂŒles, nĂ€eb, et midagi ei tööta, siis see lahendatakse kiiresti. Aga kui see on autoscale-grupp, mis on uuendatud, siis mingi hetk hakkavad autoscale-grupi instantsid asuma ĂŒksteise asemele. Ja hop, midagi ei tööta. See on tĂ”eliselt kahju.
Kas selgub, et ainus lahendus on testimine?
Jah, te nÀete probleemi, te lisate sinna testimissteppe. See tÀhendab, et ka vÀljundiga saab testida. VÔib-olla ei ole see nii mugav, aga ka siia saab mingid sildid panna - kontrollige, et User-data on siin naelutatud.
Minu nimi on Timur. On vÀga lahe, et on ettekandeid sellest, kuidas korralikult Terraformit korraldada.
Ma pole isegi alustanud.
Ma arvan, et jĂ€rgmises konverentsis vĂ”ib-olla tuleb see teema ĂŒles. Mul on lihtne kĂŒsimus. Miks te kodeerite vÀÀrtuse eraldi moodulis, mitte ei kasuta tfvars, st mis on nende vÀÀrtuste mooduli eelised vĂ”rreldes tfvars-iga?
St. kas ma pean siin (slaid: Production/environment/settings.tf) kirjutama: domain = variable, domain vpcnetwork, variable vpcnetwork ja samavÀÀrset stvars â et saada sama tulemuse?
Me ju teeme tÀpselt nii. Viitame seadistuse allikale, nÀiteks.
Sisuliselt on see nagu tfvars. Tfvars on vĂ€ga mugav testimisĂŒmbruses. Mul on tfvars suurte ja vĂ€ikeste instances jaoks. Ja ma panin ĂŒhe faili kausta. Ja sain just seda, mida tahtsin. Kui me infrastruktuuri ehitame, soovime, et oleks vĂ”imalik kĂ”ike korraga nĂ€ha ja aru saada. NĂŒĂŒd aga peab vaatama siia, siis jĂ€lle tfvars-i.
Tuleb lihtsalt, et kĂ”ik oleks ĂŒhes kohas?
Jah, tfvars on siis, kui teil on ĂŒks kood. Ja seda kasutatakse mitmes erinevas kohas, kus on eri nĂŒansid. Siis te paneksite tfvars ja saaksite oma nĂŒansid. Aga meie - see on infrastruktuur kui puhas kood. Vaata ja saa aru.
Tere! Olete silmitsi seisnud olukordadega, kus pilvuteenuse pakkuja sekkub sellesse, mida olete Terraformiga teinud? Oletame, et me redigeerime metaandmeid. Seal on ssh-vĂ”tmed. Ja Google pidevalt pĂ”histab sinna oma metaandmeid, oma vĂ”tmeid. Ja Terraform ĂŒtleb alati, et tal on muudatusi. PĂ€rast iga jooksu, isegi kui midagi ei muutu, ĂŒtleb ta alati, et ta kavatseb seda vĂ€lja vĂ€rskendada.
VĂ”tmetega, kuid â jah, osa infrastruktuurist on sellise probleemiga mĂ”jutatud, st Terraform ei saa midagi muuta. Me ei saa ka kĂ€ega midagi muuta. Elame hetkel sellega.
St, olete sellise probleemiga silmitsi seisnud, kuid pole midagi vÀlja mÔelnud, ta lihtsalt teeb ja teeb ise?
Kahjuks, jah.
Tere! Minu nimi on Starkov Stanislav. Mail.ru Group. Kuidas te lahendate probleemi sildi genereerimisega ..., kuidas te selle sisse edastate? Ma saan aru, et kasutate User â data, et mÀÀrata hosti nimi, rakendate Puppetit? Ja teine osa kĂŒsimusest. Kuidas te lahendate selle kĂŒsimuse SG-s, st kui genereerite SG-d, sadu ĂŒhesuguseid instantsi, kuidas neid Ă”igesti nimetada?
Needless instances are named nicely, while those that aren't necessary have the label indicating they are an autoscale group. In theory, these can be terminated to create a new one.
Regarding the tag issue, there isnât a problem per se, but rather a task. Our tags are extensively used because the infrastructure is large and costly. We need to track where the money goes, so tags help us untangle what expenditure is attributed to which aspect, allowing us to identify areas with high costs.
What was the other question about?
When SG creates a hundred instances, how do we differentiate them?
No, it's not necessary. Each instance has an agent that reports issues. If the agent indicates a problem, it knows about it, and at the very least, its IP address exists. That's already enough to act. Additionally, we use Consul for Discovery in places where Kubernetes isnât applicable, which also shows the IP address of the instance.
So, you are indeed focusing on the IP rather than the host name?
It's impossible to rely on the host name because there are too many. There are instance identifiers like AE, etc. You can locate it somewhere or input it in the search.
Tere! Ma sain aru, et Terraform on suurepÀrane asi, mida on kohandatud pilvetehnoloogiate jaoks.
Mitte ainult.
See kĂŒsimus huvitab mind. Kui nĂ€iteks otsustate massiliselt ĂŒle minna Bare Metal'ile koos kĂ”igi oma instantsidega, kas tekib probleeme? VĂ”i on vaja kasutada teisi tooteid, nĂ€iteks eelnevalt mainitud Ansible'd?
Ansible tegeleb veidi teistsuguste asjadega. TĂ€hendab, Ansible töötab siis, kui instants on juba kĂ€ivitatud. Terraform töötab enne, kui instants kĂ€ivitatakse. Bare Metal'ile ĂŒleminek â ei.
Praegu ei, aga Ă€ri tuleb ja ĂŒtleb: "Teeme seda."
Teisele pilve teenusele ĂŒleminek â jah, aga siin on veidi teine asi. Peab kirjutama Terraform'i koodi selliselt, et teisele pilve teenusele ĂŒleminek oleks lihtsam.
Alguses seati eesmĂ€rgiks, et kogu meie infrastruktuur oleks agnostiline, st sobiks igasugustele pilvedele, kuid mingil hetkel andis Ă€ri alla ja ĂŒtles: "Okei, lĂ€hiaastatel me ei lĂ€he kuhugi, vĂ”ime kasutada Amazon'i teenuseid."
Terraform vÔimaldab luua Front-End töid, konfigureerida PagerDuty't, data doc'i jne. Tal on vÀga palju funktsioone. Ta suudab praktiliselt kontrollida kogu maailma.
AitĂ€h ettekande eest! Olen juba nelja aasta jooksul Terraformiga tegelenud. Terraformile, infrastruktuurile ja deklaratiivsele kirjeldusele ĂŒlemineku etapis sattusime olukorda, kus keegi tegi midagi kĂ€sitsi, samal ajal kui sa proovisid teha plaani. Ja said seal mingi vea. Kuidas te selliseid probleeme lahendate? Kuidas leiate kadunud ressursid, mis olid mĂ€rgitud?
Peamiselt kĂ€sitsi ja visuaalselt, kui nĂ€eme aruandes midagi kahtlast, analĂŒĂŒsime, mis seal toimub, vĂ”i lihtsalt kĂ”rvaldame selle. Ăldiselt on koodi tĂ”mbamised tavaline asi.
Kui esineb viga, teete te rollbacki? Kas olete proovinud sellist lahendust?
Ei, see on inimese otsus hetkel, kui ta nÀeb probleemi.
Allikas: habr.com
