
Tundub, et Terraformi arendajad pakuvad piisavalt mugavaid parimaid praktikaid AWS-infrastruktuuriga töötamiseks. Ainult et on nĂŒanss. Aja jooksul suureneb keskkondade arv, igas neist on omad eripĂ€rad. Peaaegu koopia rakenduste virnast naaberriigis. Ja Terraformi kood tuleb ettevaatlikult kopeerida ja muuta vastavalt uutele nĂ”udmistele vĂ”i luua lumehelves.
Minu ettekande teema on mustrid Terraformis, et vÔidelda kaose ja kÀsitsi rutiiniga suurtes ja pikaajalistes projektides.
Video:

Mul on 40 aastat, olen IT-s olnud 20 aastat. 12 aastat töötan ettevÔttes Ixtens. Me tegeleme ecommerce-driven-development'iga. Ja 5 aastat praktiseerin DevOps-praktikaid.

Minu jutt tuleb olema kogemusest projektis ettevÔttes, mille nime ma ei nimeta, kuna olen allkirjastanud mitteavaldamise kokkuleppe.
Numbrid slaidil on esitatud selleks, et mÔista projekti ulatust. Ja kÔik, mida ma edaspidi rÀÀgin, on seotud Amazoniga.

Liitusin selle projektiga 4 aastat tagasi. Ja sama ajal toimus infrastruktuuri refaktoreerimine, kuna projekt oli kasvanud. Ja need mustrid, mida kasutati, polnud enam sobivad. Arvestades kogu projekti planeeritud kasvu, pidi midagi uut vÀlja mÔtlema.
AitÀh Matveile, kes rÀÀkis eile, mis Dodo Pitsas toimus. See on see, mis meil 4 aastat tagasi juhtus.
Tulid arendajad ja hakkasid kirjutama infrastruktuuri koodi.
KÔige ilmsed pÔhjused, miks see vajalik oli, olid turule toomise aeg. Pidi olema nii, et DevOps meeskond ei olnud kitsas koht vÀljalaskmisel. Ja lisaks kÔigele muule kasutati esimesel tasemel Terraformi ja Puppetit.

Terraform on HashiCorpi avatud lĂ€htekoodiga projekt. Ja nende jaoks, kes ĂŒldse ei tea, mis see on, jĂ€rgmised slaidid.

Infrastruktuur kui kood tÀhendab, et saame oma infrastruktuuri kirjeldada ja paluda mingitel robotitel luua need ressursid, mida oleme kirjeldanud.
NÀiteks vajame virtuiaalmasin. Me kirjeldame, lisame mÔned kohustuslikud parameetrid.

PĂ€rast seda seadistame konsoolis juurdepÀÀsu Amazonile. Ja palume Terraformil plaani. Terraform plan ĂŒtleb: "Olen, teie ressursile saame teha jĂ€rgmised asjad". Ja vĂ€hemalt ĂŒks ressurss lisatakse. Ja mingeid muutusi ei oodata.

Kui kÔik sobib, saate paluda Terraformil rakendada ja Terraform loob teile instantsi, ja saate oma pilves virtuaalse masina.

Edasi lÀheb meie projekt edasi. Me lisame sinna muudatusi. Me palume rohkem instantsi, lisame 53 kirje.

Ja kordame. Palume plaani. NĂ€eme, millised muudatused on planeeritud. Rakendame. Nii kasvab meie infrastruktuur.
Terraform kasutab sellist asja nagu olekufailid. See tÀhendab, et kÔik muudatused, mis lÀhevad Amazonisse, salvestatakse faili, kus iga ressurssi, mille olete kirjeldanud, vastavad ressursid, mis on Amazonis loodud. Nii teab Terraform tÀpselt, mida muuta Amazonis, kui ressursi kirjeldust muudetakse.

Need olekufailid olid algselt lihtsalt failid. Ja me hoidsime neid Git'is, mis oli ÀÀrmiselt ebamugav. Alati, kui keegi unustas muudatused komiteerida, tekkis palju konflikte.
NĂŒĂŒd on vĂ”imalik kasutada backend'i, see tĂ€hendab, et Terraform'ile tehakse ettepanek, millisesse bucket'isse ja mille vĂ”tme alla tuleb olekufail salvestada. Ja Terraform hoolitseb selle eest, et tuua see olekufail, teha kogu maagia ja panna lĂ”puks tulemus tagasi.

Meie infrastruktuur kasvab. Siin on meie kood. Ja me ei soovi enam lihtsalt virtuaalmasinat luua, me tahame, et oleks testimine keskkond.

Terraform vÔimaldab luua sellise asja nagu moodul, see tÀhendab, et sama asja saab kirjeldada mingis kaustas.

Ja nÀiteks testimisel kutsuda seda moodulit ja saada sama, nagu oleksime kÀitunud Terraform apply moodulis enda sees. Testimiseks oleks selline kood.

Tootmises vÔime saata sinna teatud muudatusi, sest testimisel ei ole meil suuri instantsse vaja, tootmises on suured instantsid just vajalikud.

Ja edasi tagasi projekti. Oli keeruline ĂŒlesanne, infrastruktuur kavandati vĂ€ga suureks. Ja oli vajalik kuidagi paigutada kogu kood, et see oleks mugav kĂ”igile: nii neile, kes hoolitsevad selle koodi eest, kui ka neile, kes muudatusi teevad. Ja kavandati, et iga arendaja vĂ”iks minna ja muuta infrastruktuuri nii, nagu on vajalik tema platvormi osa jaoks.
See on kataloogipuu, mida soovitab HashiCorp ise, kui teil on suur projekt ja on mĂ”istlik jagada kogu infrastruktuur vĂ€iksemateks tĂŒkkideks ning iga tĂŒkk kirjeldada eraldi kaustas.
Olles laia ressursside raamatukoguga, saab testimisel ja tootmises kutsuda umbes sama asja.

Meie puhul ei sobinud see pĂ€ris nii, kuna arendajatele vĂ”i testimiseks mĂ”eldud testihunnikud pidid olema kergemini kĂ€ttesaadavad. Ei tahtnud ju ringi kaevata kaustades ja rakendada Ă”igetes jĂ€rjestustes ning muretseda selle pĂ€rast, et andmebaas kĂ€ivitub ja siis kĂ€ivitub selle andmebaasi kasutav instants. SeetĂ”ttu kĂ€ivitati kogu testimine ĂŒhest kaustast. Seal kutsuti vĂ€lja samad moodulid, kuid kĂ”ik toimus ĂŒhe kĂ€igu jooksul.
Terraform hoolitseb kÔigi sÔltuvuste eest. Ja loob alati ressursid sellises jÀrjekorras, et nÀiteks vÀrskelt loodud instantsilt oleks vÔimalik saada IP-aadress ja see IP-aadress saada route53 kirja.
Lisaks sellele on platvorm vĂ€ga suur. Ja testihunniku kĂ€ivitamine, isegi kui vaid ĂŒheks tunniks, isegi kui 8 tunniks â see on ĂŒsna kulukas.
Ja me automatiseerisime selle protsessi. Jenkins'i töö vÔimaldas hunniku kÀivitada. Seal pidi kÀivitama pull request'i koos muudatustega, mida arendaja soovis testida, mÀÀrama kÔik vajalikud valikud, komponendid ja ka suurused. Kui ta soovis sooritustestimist, siis ta vÔis kasutada rohkem instante. Kui ta lihtsalt soovis kontrollida, kas mÔni vorm avaneb, siis vÔis ta kÀivitada vÀikestes kogustes. Samuti sai mÀÀrata, kas klaster on vajalik vÔi mitte jne.
Ja seejĂ€rel tĂ”ukas Jenkins shell-skripti, mis veidi muutis koodi Terraform kaustas. Eemaldati mittevajalikud failid, lisati vajalikud failid. Ja seejĂ€rel ĂŒhe kĂ€igutusega Terraform apply kĂ€ivitus hunnik.
Ja siis jĂ€rgnesid muud sammud, millesse ma ei taha sĂŒveneda.

Kuna testimiseks vajasime veidi rohkem valikuid kui tootmises, pidime moodulite koopiaid tegema, et neis koopiaides oleks vÔimalik lisada funktsioone, mis on vajalikud ainult testimiseks.
Nii juhtus, et testimisel sooviti testida neid muudatusi, mis lĂ”puks lĂ€hevad tootmisse. Kuid tegelikult testiti ĂŒht, samas kui tootmises rakendati pisut muud. Ja tekkis vĂ€ikene lĂ”he olukorras, et tootmises rakendati kĂ”ik muudatused opereerimise meeskonna poolt. Ja mĂ”nikord juhtus nii, et need muudatused, mis pidid testimisest tootmisse minema, jĂ€id teise versiooni.
Sellega seondub veel probleem, et lisandus uus teenus, mis erines veidi mÔnest juba olemas olevast. Ja selle asemel, et olemasolevat moodulit kohandada, tuli teha selle koopia ja lisada vajalikud muudatused.
Sisuliselt ei ole Terraform tÔeline keel. See on deklaratsioon. Kui meil on midagi deklareerimiseks vaja, siis me deklareerime selle. Ja kÔik see töötab.
Ăhel hetkel, kui arutati ĂŒhte minu pull-requesti, ĂŒtles ĂŒks kolleeg, et ei peaks lund tootma. Huvitav, mida ta silmas pidas. On olemas teaduslik fakt, et maailmas ei ole kaks identset lumevalget, nad kĂ”ik erinevad veidi. Ja kui ma seda kuulsin, tundsin ma kohe kogu Terraform-koodi raskust. Sest kui tuli minna versioonilt versioonile, nĂ”udis Terraform breaking chain muutusi, st. kood ei olnud uue versiooniga enam ĂŒhilduv. Ja tuli teha pull-request, mis katab peaaegu poole infrastruktuuri failidest, et viia infrastruktuur jĂ€rgmise Terraform versioonini.
Ja pÀrast seda, kui selline lumi tekkis, muutus kogu meie Terraform-kood suureks lumemÀeks.
VÀlist arendaja jaoks, kes ei ole operatsioonis, ei ole sellega suurt tÀhtsust, sest ta tegi pull-requesti, tema ressurss kÀivitus. Ja kÔik, edaspidi ei ole see tema mure. Kui aga DevOps meeskonnale, kes jÀlgib, et kÔik oleks OK, tuleb teha kÔik need muudatused. Ja nende muudatuste hind tÔusis iga tÀiendava lumehelbega vÀga-vÀga palju.

On olemas lugu sellest, kuidas ĂŒliĂ”pilane seminari ajal kannab kriidiga tahvlile kaks ideaalset ringi. Ja Ă”petaja imestab, kuidas tal Ă”nnestus ilma kompassita nii ĂŒhtlaselt joonistada. ĂliĂ”pilane vastab: "VĂ€ga lihtsalt, ma keerutasin kaks aastat armees lihaveskit."
Ja nendest neljast aastast, mil ma olen selles projektis osalenud, olen ma umbes kaks aastat tegelenud Terraformiga. Ja muidugi on mul mÔned nipid, mÔned nÔuanded, kuidas Terraform-koodi lihtsustada, sellega nagu programmeerimiskeelega töötada ja vÀhendada koormust arendajatele, kes peavad seda koodi ajakohasena hoidma.

Esimene asi, millega soovin alustada, on Symlinks. Terraformil on palju korduvat koodi. NÀiteks kasutatakse pakkujat praktiliselt igas kohas, kus me loome infrastruktuuri osa, sama. Ja on mÔistlik viia see eraldi kausta. Ja igal pool, kus pakkujat on vaja, luua Symlinks sellele failile.

NĂ€iteks, kui teil on tootmises kasutada assume role, mis vĂ”imaldab teil saada juurdepÀÀsu mingile vĂ€lishaava Amazon-kontole. Ja muutes ĂŒhte faili, saavad kĂ”ik ĂŒlejÀÀnud, mis on ressursipuus, vajalikud Ă”igused, et Terraform teaks, millise Amazon-segmendi poole pöörduda.

Kus Symlinks ei tööta? Nagu öeldud, on Terraformil state-failid. Ja need on vÀga-vÀga Àgedad. Kuid probleem on selles, et Terraform initsialiseerib backend esimesena. Ja ta ei saa nende parameetrites kasutada mingeid muutujaid, need tuleb alati kirjutada tekstina.
Ja tulemuseks on see, et 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 sandboxist sandbox-asi ja siis loob tootmises. Ja vÔib juhtuda, et tootmise bucket'i kasutatakse sandboxist. Muidugi, seda leitakse kiiresti. See saab kuidagi parandatud, kuid sellegipoolest on see ajakaotus ja teatud mÀÀral ressursside kaotus.

Mida me saame edasi teha? Enne Terraformiga töötamist tuleb see initsialiseerida. Initsialiseerimise hetkel laadib Terraform alla kÔik pluginad. Need on mingil hetkel monoliidist lagunenud mikroteenuste arhitektuuriks. Ja alati on vajalik teha Terraform init, et see laaks kÔik moodulid, kÔik pluginad.
Ja saab kasutada shell-skripti, mis, esiteks, suudab hankida kÔik muutujad. Shell-skript ei ole millegiga piiratud. Ja teiseks, teed. Kui me alati kasutame seda teed, mis on hoidlas state-faili vÔtmena, siis vastavalt on see viga vÀlistatud.

Kust andmeid hankida? JSON-failist. Terraform vÔimaldab salvestada infrastruktuuri mitte ainult hcl (HashiCorp Configuration Language) vormingus, vaid ka JSON-is.
JSON on shell-skripti kaudu kergesti loetav. Seega saab mingisse kohta paigutada konfigureerimisfaili bucketiga. Ja kasutada seda bucketit nii Terraform-koodis kui ka shell-skripti initsialiseerimiseks.

Miks on oluline omada bucketit Terraformi jaoks? SellepĂ€rast, et on olemas selline asi nagu remote state-failid. See tĂ€hendab, et kui ma tĂ”stan mingit ressurssi, pean ma Amazonile ĂŒtlema: "Palun tĂ”sta instance", mille jaoks pean ma mÀÀrama vĂ€ga palju kohustuslikke parameetreid.
Ja need tuvastajad salvestatakse kuhugi teise kausta. Ja ma vĂ”in öelda: "Terraform, mine palun sealolevale state-failile ja tĂ”sta mulle need tuvastajad ĂŒles." Nii tekib teatud ĂŒhtsus erinevate piirkondade vĂ”i keskkondade vahel.
Kauget state-faili ei saa alati kasutada. NÀiteks, kui olete kÀsitsi loonud VPC. Ja see Terraformi kood, mis loob VPC, loob nii erineva VPC, et selle kohandamine on vÀga aeganÔudev ja keeruline, seetÔttu vÔib kasutada jÀrgmist nippi.

Ehkki luua moodul, mis justkui loob VPC ja siiski annab teile tuvastajad, kuid tegelikult on lihtsalt fail, kus on kÔvad vÀÀrtused, mida saab kasutada sama instance'i loomisel.

Ei ole alati vajalik salvestada state-faili pilve. NÀiteks, kui testitakse mooduleid, vÔib kasutada backendi initsialiseerimist, kus fail salvestatakse testimise ajal lihtsalt kettale.

NĂŒĂŒd rÀÀgime veidi testimisest. Mida saab Terraformis testida? TĂ”enĂ€oliselt palju, kuid ma rÀÀgin nendest neljast asjast.
HashiCorpil on arusaam, kuidas tuleks Terraformi koodi vormindada. Ja Terraform fmt vÔimaldab teil vormindada teie redigeeritavat koodi vastavalt nende reeglitele. Seega peavad testid tingimata kontrollima, kas vormindamine vastab HashiCorpi pÀrandile, et ei peaks kohtade vahetama ja nii edasi.

JĂ€rgmine on Terraform validate. See teeb veidi enam kui ainult sĂŒntaksikontroll â kontrollib nĂ€iteks, kas kĂ”ik sulud on paarisarvud. Mis on siin oluline? Meie infrastruktuur on vĂ€ga laialdane. Seal on palju erinevaid kaustu. Ja igaĂŒhes tuleb kĂ€ivitada Terraform validate.
SeetÔttu, et testimist kiirendada, kÀivitame mitu protsessi samaaegselt, kasutades paralleelsust.
Paralleelsus on vÀga lahe asi, kasutage seda.
Aga iga kord, kui Terraformi initsialiseerimine toimub, lĂ€heb ta HashiCorpi ja kĂŒsib: âMillised on viimased pluginaversioonid? Ja see plugin, mis mul on cache'is - kas see on Ă”ige vĂ”i vale?â. Ja see aeglustab iga sammu.

Kui Terraformile öelda, kus pluginad asuvad, siis ĂŒtleb Terraform: âKuna see on tĂ”enĂ€oliselt kĂ”ige vĂ€rskem, ei lĂ€he ma kuhugi ning hakkan kohe teie Terraform-koodi valideerima.â

Selleks, et tĂ€ita kaust vajalike pluginatega, on meil vĂ€ga lihtne Terraformi kood, mis tuleb lihtsalt initsialiseerida. Siin tuleb muidugi luetleda kĂ”ik pakkujad, kes teie koodis osalevad, vastasel juhul ĂŒtleb Terraform: âMa ei tunne seda pakkujat, sest teda pole cache'is.â

JĂ€rgmine on Terraformi plaan. Nagu öeldud, on arendus tsĂŒkliline. Me teeme koodi muutustega ning pĂ€rast seda on vaja vĂ€lja selgitada, millised muudatused on infrastruktuuri planeeritud.
Ja kui infrastruktuur on vĂ€ga-Ă€ga suur, vĂ”ib ĂŒks moodul muudetud olla, testimiskeskkond parandatud vĂ”i konkreetne piirkond kahjustatud ning see vĂ”ib rikkuda mĂ”nda naabruses asuvat. SeetĂ”ttu peab Terraformi plaan olema kogu infrastruktuuri jaoks ja nĂ€itama, millised muudatused on planeeritud.
Seda saab teha nutikalt. NÀiteks oleme kirjutanud Pythonis skripti, mis lahendab sÔltuvused. Ja sÔltuvalt sellest, mis on muutunud: Terraformi moodul vÔi lihtsalt mÔni konkreetne komponent, loob ta plaanid kÔigi sÔltuvate kaustade jaoks.
Terraformi plaane tuleks teha nÔudmisel. VÀhemalt on see see, mida meie teeme.
Testid on loomulikult head teha iga muutuse ja iga commit'i jaoks, kuid plaanid on piisavalt kulukad. Ja me pull requestis ĂŒtleme: âPalun anna mulle plaanidâ. KĂ€ivitub robot, kes saadab kommentaaridesse vĂ”i manusesse kĂ”ik plaanid, mis on planeeritud teie muudatustest.
Plaan on ĂŒsna kulukas asi. See vĂ”tab aega, sest Terraform lĂ€heb Amazonisse ja kĂŒsib: âKas see instance on ikka olemas? Kas selle autoscale'i parameetrid on tĂ€pselt sellised?â. Ja selle kiirusestamiseks vĂ”ib kasutada parameetrit refresh=false. See tĂ€hendab, et Terraform tĂ”mbab S3-st staatuse. Ja usub, et olek vastab tĂ€pselt sellele, mis on Amazonis.
Selline Terraformi plaan kulgeb palju kiiremini, kuid olek peab vastama teie infrastruktuurile, st kuskil, kunagi peab olema kÀivitatud Terraform refresh. Terraform refresh teeb tÀpselt seda, et olek vastaks sellele, mis on reaalsetes infrastruktuurides.
Ja tuleb rÀÀkida turvalisusest. Sellega oleks tulnud alustada. Seal, kus te kÀivitate Terraformi ja Terraform töötab teie infrastruktuuriga, on oht. St, te tÔeliselt tÀidate koodi. Ja kui pull request sisaldab mingit pahatahtlikku koodi, siis see vÔib kÀivituda infrastruktuuris, millel on liiga palju ligipÀÀsu. SeetÔttu olge ettevaatlik, kus te kÀivitate Terraformi plaani.

JÀrgmisena, millest ma tahaksin rÀÀkida, on user-data testimine.
Mis on user-data? Amazonis, kui me loome instantsi, saame instantsilt saata mingi kirja â metaandmed. Kui instants kĂ€ivitatakse, siis tavaliselt on cloud init alati nende instantside peal. Cloud init loeb seda kirja ja ĂŒtleb: âOkei, tĂ€na olen ma load balancerâ. Ja nende lubaduste kohaselt sooritatakse mingeid toiminguid.

Kahjuks, kui me teeme Terraformi plaani ja Terraformi aplikaatsiooni, paistab user-data vÀlja nagu selline arvu segu. St see lihtsalt saadab teile hash'i. Ja kÔik, mida saate plaanis vaadata, on kas mÔni muutus toimub vÔi hash jÀÀb tÀpselt samaks.
Ja kui sellele ei pöörata tÀhelepanu, vÔib Amazonisse, reaalsetesse infrastruktuuridesse, minna mingi rikutud tekstifail.

Alternatiivina saate kĂ€ivitamisel mĂ€rgata mitte kogu infrastruktuuri, vaid ainult template'i. Ja koodis öelda: âPalun, nĂ€ita mulle seda template'iâ. Ja lĂ”puks saate vĂ€ljatrĂŒki, milline teie andmed Amazonis vĂ€lja nĂ€evad.

Teine variant on kasutada moodulit user-data genereerimiseks. Te rakendate selle mooduli. Saate faili kettale. VĂ”rdlete seda referentsfailiga. Ja niimoodi, kui mĂ”ni algaja otsustab veidi user-data parandada, ĂŒtlevad teie testid: âOkei, siin ja siin on mingid muutused â see on normaalneâ.

JÀrgmisena, millest ma tahaksin rÀÀkida, on Automatiseeritud Terraform aplikaatsioon.
Muidugi on Terraformi aplikaatsiooni automaatne kĂ€ivitamine ĂŒsna hirmuĂ€ratav, sest kes teab, millised seal muudatused on ja kui laastavad need vĂ”ivad olla elavale infrastruktuurile.
Testkeskkonna jaoks on see kÔik 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Ôend sellest, et inimene on vaeva nÀinud, seadistanud steki, kÀivitanud stekil mÔningad testid. Ja veendunud, et seal on kÔik korras ja öelnud: "Okei, see kood, mille ma vÀlja annan, on testitud."
Tootmis-, liivakasti ja teistes keskkondades, mis on ettevÔtte jaoks olulisemad, vÔib osaliselt rakendada mÔningaid ressursse piisavalt ohutult, sest see ei too endaga kaasa, et keegi sureb. Need on: autoscale-grupid, turvagrupid, rollid, route53 ja seal vÔib olla piisavalt suur nimekiri. Kuid jÀlgige, mis toimub, lugege automaatsete rakenduste aruandeid.
Seal, kus rakendamine on ohtlik vĂ”i hirmus, nĂ€iteks kui tegemist on mĂ”ningate pĂŒsivate ressurssidega, andmebaasidega, siis saage aruandeid selle kohta, et teatud sektoris infrastruktuuris on rakendamata muudatused. Ja insener, olles jĂ€relevalve all, kĂ€ivitab tööd, et rakendada need vĂ”i teeb seda oma konsoolist.
Amazonis on selline asi nagu Terminate protection. See vĂ”ib teatud juhtudel kaitsta teid soovimatute muudatuste eest. See tĂ€hendab, et Terraform lĂ€heb Amazoni ja ĂŒtleb: "Mul on vaja see instants tappa, et teha teine." Aga Amazon ĂŒtleb: "Kahjuks ei tĂ€na. Meil on aktiveeritud Terminate protection."

Ja tordi kirss â see on koodi optimeerimine. Kui me töötame Terraform-koodiga, peame moduulile edastama vĂ€ga suure hulga parameetreid. Need on need parameetrid, mis on vajalikud mingite ressursside loomiseks. Ja kood muutub suurteks parameetrite loenditeks, mida tuleb edastada ĂŒhest modulist teise, eriti kui moodulid on pesastatud.
Ja see on vĂ€ga keeruliselt loetav. Selle ĂŒle on vĂ€ga keeruline teha ĂŒlevaatust. Ja vĂ€ga tihti juhtub, et mĂ”ned parameetrid saavad ĂŒlevaatusest lĂ€bi, kuid need pole 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 teatud vÀÀrtuste puu. See tÀhendab, et on vajalik mingi kaust, kus on loetletud kÔik vÀÀrtused, mida sooviksite mingisuguses keskkonnas omada.

Ja kutsudes seda moodulit, saab luua puu, mis genereeritakse ĂŒhes ĂŒldises moodulis, st ĂŒldises moodulis, mis töötab ĂŒhtviisi kogu infrastruktuuri jaoks.
Selles moodulis on vĂ”imalik teostada kalkulatsioone, kasutades sellist vĂ€rsket omadust Terraformis nagu locals. Ja siis ĂŒks outputâiga anda mingisugune keeruline parameeter, mis vĂ”ib sisaldada hĂ€she, massiive jne.

Sellega on kĂ”ik parimad leidud, mis mul on, otsa saanud. Ja tahaksin rÀÀkida lugu Kolumbusest. Kui ta otsis raha oma ekspeditsioonile, et avastada Indiat (nagu ta tol ajal arvas), ei uskunud keegi temasse ja arvasid, et see on vĂ”imatu. Siis ĂŒtles ta: "Tehke nii, et muna ei kukuks." KĂ”ik pangandusmehed, vĂ€ga rikaste ja tĂ”enĂ€oliselt nutikate inimestena, ĂŒritasid mingil moel muna pĂŒsti seada, kuid see kukkus pidevalt. Siis vĂ”ttis Kolumbus muna, vajutas sellele natuke. Koor pressiti kokku ja muna jĂ€i liikumatuks. Nad ĂŒtlesid: "Oh, see on liiga lihtne!". Ja Kolumbus vastas: "Jah, see on liiga lihtne. Ja kui ma avastan India, siis kĂ”ik hakkavad seda kaubateed kasutama."
Ja see, mida ma teile praegu rÀÀkisin, on tĂ”enĂ€oliselt piisavalt lihtsad ja triviaalset asjaolud. Ja kui sa neist kuulete ja hakkate neid kasutama, on see tĂ€iesti normaalne. Nii et kasutage. Ja kui need asjad on teie jaoks tĂ€iesti normaalsed, siis vĂ€hemalt teate, kuidas muna pĂŒsti seada, et see ei kukuks.

Teeme kokkuvÔtte:
- PĂŒĂŒdke vĂ€ltida lumesid. Ja mida vĂ€hem lumesid, seda vĂ€hem ressursse vajate, et teha mingeid muudatusi kogu teie suurtes infrastruktuurides.
- Pidevad muudatused. St. kui koodis on toimunud muudatusi, tuleb teie infrastruktuur viia vÔimalikult kiiresti vastavusse nende muudatustega. Ei tohi juhtuda, et keegi tuleb kahe-kolme kuu pÀrast vaatama Elasticsearchi, teeb Terraform plaani ja seal on kuhjaga muudatusi, mida ta ei oodanud. Ja kulub vÀga palju aega, et kÔik tagasi korda saada.
- Testid ja automatiseerimine. Mida rohkem on teie kood kaetud testidega ja funktsioonidega, seda rohkem on teil kindel tunne, et teete kÔik Ôigesti. Ja automaatne tarnimine suurendab teie usaldust mitmekordselt.
- Testi- ja tootmisringkonna kood peab olema praktiliselt identne. Praktiliselt, kuna tootmine on siiski veidi erinev ja seal on ikka mingid nĂŒansid, mis ĂŒletavad testimisringkonna piirid. Sellegipoolest on plusspoolel see, et seda on vĂ”imalik tagada.
- Ja kui teil on vÀga palju Terraform-koodi ja selle koodi ajakohasena hoidmine nÔuab vÀga palju aega, siis pole kunagi liiga hilja refaktooringut teha ja see heasse vormi viia.

- Muudetav infrastruktuur. AMI tarnimine ajakava jÀrgi.
- Struktuur route53 jaoks, kui teil on vÀga palju kirjeid ja soovite, et need oleksid korralikus jÀrjekorras.
- API mÀÀrangupiiride ĂŒletamine. See on siis, kui Amazon ĂŒtleb: "KĂ”ik, kĂ”ik, ma ei saa rohkem pĂ€ringuid vĂ”tta, palun oodake." Ja pool ettevĂ”ttest ootab, kuni nad saavad oma infrastruktuuri kĂ€ivitada.
- Spot instantsid. Amazon ei ole odav ettevÔtmine ja spotsid vÔimaldavad palju sÀÀsta. Ja sellest vÔiks rÀÀkida terve ettekande.
- Turvalisus ja IAM rollid.
- Kaotatud ressursside leidmine, kui Amazones on ebamugava pĂ€ritoluga instantsid, mis söövad raha. Isegi kui instants maksab 100-150 dollarit kuus â aastas on see rohkem kui 1 000. Selliste ressursside leidmine on kasumlik Ă€ri.
- Ja reserveeritud instantsid.

Siinkohal on mul kÔik. Terraform on vÀga Àge, kasutage seda. AitÀh!
KĂŒsimused
AitÀh ettekande eest! Teil on state-fail S3-s, aga kuidas te lahendate probleemi, et mitu inimest vÔivad seda state-faili vÔtta ja proovida seda taasluua?
Esiteks, me ei kiirusta. Teiseks, meil on lipud, millega me teatame, et töötame mĂ”ne koodiosa kallal. St kuigi infrastruktuur on vĂ€ga suur, ei tĂ€henda see, et keegi pidevalt midagi rakendab. Ja kui aktiivne faas oli â oli see probleem, meil oli state-failid Git-is. See oli oluline, vastasel juhul keegi teeb state-faili ja pidime neid kĂ€sitsi kokku koguma, et kĂ”ik edasi kulgeks. Praegu sellist probleemi ei ole. Aga ĂŒldiselt lahendas Terraform selle ĂŒlesande. Ja kui pidevalt midagi muutub, siis saad kasutada lukke, mis takistavad seda, mida te ĂŒtlesite.
Kasutate avatud versiooni vÔi ettevÔtte versiooni?
Mingit ettevÔtte versiooni ei ole, 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 muuta instance'i hÀvitamatuks. See on olemas ka Terraform'is, Life Second plokis saab mÀÀrata muutmise keelu vÔi hÀvitamise keelu.
Aeg oli piiratud. Hea mÀrkamine.
Soovisin veel kahte asja kĂŒsida. Esiteks, te rÀÀkisite testimisest. Kas olete kasutanud mingeid tööriistu testimiseks? Olen kuulnud Test Kitchen'i pluginast. VĂ”ib-olla on veel midagi. Ja soovin kĂŒsida Local Values kohta. Kuidas need ĂŒldiselt erinevad Input Variables from? Miks ma ei saa parametrizeerida midagi ainult Local Values kaudu? Olen proovinud seda teemat mĂ”ista, kuid ei ole vĂ€ga aru saanud.
Saame sellest saalist tĂ€psemalt rÀÀkida. Testimise tööriistad â need on meil tĂ€ielik omavalmistus. Seal ei ole midagi sellist, millega testida. Tegelikult on vĂ”imalusi, kus automaatsed testid ĂŒles tĂ”stavad infrastruktuuri kuskil, kontrollivad, et see on korras, ja siis kĂ”ik hĂ€vitavad aruannete koostamisega, et teie infrastruktuur on endiselt heas seisus. Meil seda ei ole, kuna testimissteigid kĂ€ivituvad iga pĂ€ev. Ja sellest piisab. Ja kui midagi hakkab katki minema, siis see hakkab katki minema ilma, et me veel kuskil seda kontrollime.
Local Values'i osas jÀtkame vestlust saalist vÀljas.
Tere! AitÀh ettekande eest! VÀga hariv. RÀÀkisite, et teil on palju sarnast koodi infrastruktuuri kirjeldamiseks. Kas olete kaalunud selle koodi genereerimise vÔimalust?
SuurepĂ€rane kĂŒsimus, aitĂ€h! Tegelikult, kui kasutame infrastruktuuri kui koodi, eeldame, et vaatame koodi ja mĂ”istame, mis infrastruktuur selle koodi taga on. Kui kood genereeritakse, peame ette kujutama, milline kood genereeritakse, et mĂ”ista, mis infrastruktuur seal on. Kas me genereerime koodi, kommidime selle ja pĂ”himĂ”tteliselt saame sama asja. SeetĂ”ttu lĂ€ksime teed, mida me kirjutasime, saime selle. Pluss generaatorid tulid mĂ”ni aeg hiljem, kui me hakkasime tegema. Ja oli juba hilja seda muuta.
Kas olete jsonnet'ist midagi kuulnud?
Ei.
Vaata, see on vÀga Àge asi. NÀen konkreetset kasutusjuhtu, kus seda saab rakendada ja andmestruktuuri genereerida.
Generaatoreid on hea kasutada, kui teil on nagu anekdoot ĂŒhekordsest raseerimisaparaadist. Ehkki esmakordselt vĂ”ib nĂ€gu erineda, on hiljem kĂ”igil sama nĂ€gu. Generaatoreid on vĂ€ga tore kasutada. Kuid meil on kahjuks nĂ€od natuke erinevad. See on probleem.
Vaata lihtsalt. AitÀh!
Minu nimi on Maksim, olen Sberbankist. Te rÀÀkisite veidi sellest, et ĂŒritasite Terraformi tuua programmeerimiskeele analooge. Kas ei oleks lihtsam kasutada Ansible'i?
Need on vÀga erinevad asjad. Sa saad Ansible'iga ressursse luua ja Puppetiga on vÔimalik ressursse Amazonis luua. Kuid Terraform on selleks otstarbeks spetsiaalselt loodud.
Kas teil on ainult Amazon?
Probleem ei ole selles, et meil on ainult Amazon. Meil on peaaegu ainult Amazon. Kuid peamine omadus on see, et Terraform mĂ€letab. Ansible'iga, kui sa ĂŒtled: âTĂ”sta mulle 5 instancesâ, siis ta tĂ”stab need ĂŒles, aga siis ĂŒtled: âNĂŒĂŒd tahan 3â. Terraform ĂŒtleb: âOkei, 2 lĂŒkkan vĂ€ljaâ, aga Ansible ĂŒtleb: âOkei, siin sul on 3â. Kokku on seega 8.
Tere! AitÀh teie ettekande eest! Oli vÀga huvitav kuulda Terraformist. Tahan kohe anda vÀikese kommentaari seoses sellega, et Terraformil tÔepoolest puudub stabiilne versioon, seega suhelge Terraformiga suure ettevaatlikkusega.
Hea lusikas on lĂ”unasöögiks. Ehk kui sul on lahendus vajalik, siis mĂ”nikord lĂŒkkad edasi selle, mis ei ole stabiilne jne, kuid see töötab ja aitas meid.
KĂŒsimus on selline. Kas te kasutate Remote backend'i, kasutate S3. Miks te ametlikku backend'i ei kasuta?
Ametlik?
Terraform Cloud.
Kuidas see tekkis?
Neli kuud tagasi.
Kui see oleks ilmunud 4 aastat tagasi, siis ilmselt oleksin ma teie kĂŒsimusele vastanud.
Seal on juba sisseehitatud funktsioon ja lukud, samuti saab salvestada state-faili. Proovige. Kuid ma ka ei ole seda testinud.
Me sÔidame suurel rongil, mis liigub suure kiirusiga. Ja ei saa lihtsalt vÔtta ja visata mÔned vagunid vÀlja.
Te rÀÀkisite lumehelbeist, aga miks te ei kasutanud branch'i? Miks see ei Ônnestunud?
Meie lĂ€henemine on selline, et kogu infrastruktuur on ĂŒhes hoidlas. Terraform, Puppet, kĂ”ik skriptid, mis kuidagi sellega seonduvad, on kĂ”ik ĂŒhes hoidlas. Nii saame garanteerida, et jĂ€rkjĂ€rgulisi muudatusi testitakse ĂŒkshaaval. Kui see oleks hunnik branche, oleks sellist projekti praktiliselt vĂ”imatu hooldada. Aastaga nad lahknevad nii palju, et see on lihtsalt karistus. See on see, millest tahaks enne refaktoreerimist eemale pÀÀseda.
Ehk see ei toimi?
See ei tööta ĂŒldse.
Branchis lĂ”ikasin ma kausta slaidi. St, kui teha iga teststaki jaoks nĂ€iteks A meeskonnale oma kaust ja B meeskonnale oma kaust, siis see ei tööta ka. Me tegime ĂŒhtse testkeskkonna koodi, mis oli piisavalt paindlik, et sobida kĂ”igile. St, me haldasime ĂŒhte koodi.
Tere! Minu nimi on JĂŒri! AitĂ€h ettekande eest! KĂŒsimus moodulite kohta. Te ĂŒtlete, et kasutate mooduleid. Kuidas te lahendate olukorra, kui ĂŒhte moodulit on muudetud nii, et see ei ĂŒhildu kellegi teise muudatustega? Kas versioonite mooduleid vĂ”i proovite tuua midagi, et vastata kahele nĂ”udmisele?
See on suur lumehange. See on see, millest me kannatame, kui mÔni ohutu muudatus vÔib rikkuda mingi osa infrastruktuurist. Ja see on mÀrgatav alles pikema aja pÀrast.
St, seni ei ole see kuidagi lahendatud?
Teete universaalseid mooduleid. VÀltige lumehelbeid. Ja kÔik Ônnestub. Ettekanne teine pool rÀÀgib sellest, kuidas seda vÀltida.
Tere! AitÀh ettekande eest! Tahaksin tÀpsustada. Varjatud jÀi suur hulk, millepÀrast ma tulin. Kuidas on integreeritud Puppet ja rollide jaotamine?
User-data.
St, lihtsalt viskate faili vÀlja ja kuidagi teete seda jÀrgi?
User-data on mĂ€rkmed, st, kui me teeme klooni pildist, siis tĂ”useb Daemon ja ĂŒritab aru saada, kes ta on, loeb mĂ€rkmeid, et ta on koormuse tasakaalustaja.
St, see on mingi eraldi protsess, mis antakse edasi?
Me ei loonud seda. Me kasutame seda.
Tere! Mul on just kĂŒsimus User-data kohta. Te ĂŒtlesite, et seal on probleeme, et keegi vĂ”ib midagi valesti edastada. Kas on mingi viis user-data salvestamiseks samas Git'is, et oleks alati selge, millele user-data viitab?
Meie User-data genereeritakse template'ist. See tĂ€hendab, et sinna kasutatakse teatud hulk muutujaid. Ja Terraform genereerib lĂ”pptulemuse. SeetĂ”ttu ei saa lihtsalt vaadata template'it ja öelda, mis vĂ€lja tuleb, sest kĂ”ik probleemid on seotud sellega, et arendaja arvab, et ta edastab selle muutuja kaudu stringi, samas kui seal tuleb vĂ€lja massiiv. Ja siis â ups ja mina â see, see, jĂ€rgmine rida ja kĂ”ik lĂ€heb katki. Kui see on uus ressurss ja inimene tĂ”stab selle ĂŒles, nĂ€eb ta, et midagi ei tööta, siis see lahendatakse kiiresti. Aga kui see on autoscale-grupp, mis on uuendatud, siis mingil hetkel hakkavad autoscale-grupi instantsid vahetuma. Ja ups, midagi ei tööta. See on kurb.
Kas ainus lahendus on testimine?
Jah, te nĂ€ete probleemi, lisate sinna testimise etapid. See tĂ€hendab, et output'i saab samuti testida. VĂ”ib-olla ei ole see nii mugav, aga saab ka mingid sildid panna â kontrollige, et User-data on siin naeltega kinni.
Minu nimi on Timur. On vÀga tore, et on ettekandeid selle kohta, kuidas Ôigesti Terraform'i organiseerida.
Ma pole isegi veel alustanud.
Ma arvan, et jĂ€rgmine konverents on vĂ”imalik. Mul on lihtne kĂŒsimus. Miks te kĂ”vakoodite vÀÀrtuse eraldi moodulis, mitte ei kasuta tfvars'i, st mis on mooduli vÀÀrtustes parem kui tfvars?
Kuidas oleks, kui ma siin (slaid: Production/environment/settings.tf) kirjutaksin: domain = muutuja, domain vpcnetwork, muutuja vpcnetwork ja stvars â saada vĂ€lja sama?
Me teeme tÔesti samamoodi. Viitame nÀiteks mooduli setting source'ile.
PĂ”himĂ”tteliselt on see selline tfvars. Tfvars on testimise keskkonnas vĂ€ga mugav. Mul on tfvars suuremate instantside jaoks, vĂ€ikeste jaoks. Ja ma viskasin ĂŒhe faili kausta. Ja sain selle, mida tahtsin. Kui me lĂ”ikame infrastruktuuri, tahame, et oleks vĂ”imalik vaadata ja kohe kĂ”ik aru saada. Nii aga on, et pean vaatama siia, siis vaatama tfvars'i.
Kas see tĂ€hendab, et kĂ”ik oleks ĂŒhes kohas?
Jah, tfvars on siis, kui teil on ĂŒks kood. Ja see kasutatakse mitmes erinevas kohas erinevate nĂŒanssidega. Siis viskaksite tfvars'i ja saaksite oma nĂŒansid. Ja meie â see on infrastruktuur nagu kood puhtaima vormis. Vaatad ja mĂ”istad.
Tere! Kas olete sattunud olukordadesse, kus pilveteenuse pakkuja sekkub sellesse, mida olete teinud Terraformiga? Oletame, et me redigeerime metadata. Seal on ssh-vĂ”tmed. Ja Google pidevalt lisab sinna oma metadata, oma vĂ”tmeid. Ja Terraform kirjutab alati, et tal on muudatusi. Iga kord, isegi kui midagi ei muutu, ĂŒtleb ta alati, et ta kavatseb seda vahetust vĂ€rskendada.
VÔtmetega, jah, osa infrastruktuurist on sellesse asja haavatud, st Terraform ei saa midagi muuta. Me ei saa ka kÀega midagi muuta. Elame sellega.
St olete selle olukorraga silmitsi seisnud, aga ei ole midagi vÀlja mÔelnud, ta teeb ja teeb ise?
Kahjuks, jah.
Tere! Minu nimi on Starkov Stanislav. Mail.ru Group. Kuidas lahendate probleemi sildi genereerimisel ... kuidas te selle edastate? Ma saan aru, et lĂ€bi Userâdata, et nĂ€idata host-nime, suunata Puppet? Ja teine kĂŒsimuse osa. Kuidas te seda kĂŒsimust lahendate SG-s, st kui genereerite SG-d, sada sarnast instantsi, kuidas neid Ă”igesti nimetada?
Need instantsid, mis on meile vÀga olulised, me nimetanud ilusasti. Need, mis pole vajalikud, seal on mÀrk, et see on autoscale-grupp. Ja ideeliselt on vÔimalik see lÔpetada ja saada uus.
Sildi probleemide osas pole sellist probleemi, aga on selline ĂŒlesanne. Ja sildid on meil vĂ€ga-vĂ€ga tugevalt kasutusel, sest infrastruktuur on suur ja kallis. Ja me peame vaatama, kuhu raha lĂ€heb, seega sildid vĂ”imaldavad jĂ€lgida, mis ja kuhu on lĂ€inud. Ja vastavalt sellele otsida, et kuski kulutatakse liiga palju raha.
Mille kohta oli veel kĂŒsimus?
Kui SG loob sada instantsi, tuleb neid kuidagi eristada?
Ei, ei ole vaja. Igal instantsil on agent, kes teatab, et mul on probleem. Kui agent teatab, siis agent teab temast ja vÀhemalt tema IP-aadress eksisteerib. Juba saab minna. Teiseks, meil on kasutusel Consul Discovery jaoks, seal, kus ei ole Kubernetes. Ja Consul nÀitab samuti instantsi IP-aadressi.
St te orienteerute just IP-le, mitte host-nimele?
Ei ole vĂ”imalik orienteeruda host-nimele, neid on vĂ€ga palju. On instantsi identifikaatorid â AE jne. Selle vĂ”ib kuskil leida, selle vĂ”ib otsingusse panna.
Tere! Ma sain aru, et Terraform on hea asi, mis on kohandatud pilvede jaoks.
Mitte ainult.
Just this question interests me. If you decide to switch en masse to Bare Metal with all your instances, will there be any problems? Or will you still have to use other products, like the Ansible mentioned here?
Ansible is a bit different. That is, Ansible operates once the instance has started. Terraform works before the instance starts. Switching to Bare Metal is not.
Not right now, but a business will come and say: 'Let's do it'.
Switching to another cloud is possible, but thereâs a slightly different aspect here. You need to write Terraform code in such a way that transitioning to another cloud can be done with minimal effort.
Initially, we set the goal that our entire infrastructure should be agnostic, meaning that any cloud should work, but at some point, the business gave in and said: 'Okay, for the next N years we won't go anywhere, we can use services from Amazon.'
Terraform allows you to create Front-End jobs, configure PagerDuty, data docs, etc. It has a lot of capabilities. It can practically control the entire ecosystem.
Thank you for the presentation! Iâve also been working with Terraform for 4 years. During the gradual transition to Terraform, to infrastructure, to declarative descriptions, we encountered situations where someone was doing something manually, and you were trying to create a plan. And you encountered some kind of error. How do you resolve these issues? How do you find the lost resources that were indicated?
Mostly by hand and eye; if we see something strange in the report, we analyze what is happening there, or just delete it. Overall, pull requests are a common practice.
If there is an error, do you perform a rollback? Have you tried doing that?
No, that's a human decision in the moment when he sees a problem.
Allikas: habr.com
