Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

It soe lykje dat de Terraform-ûntwikkelders frij handige bêste praktiken biede foar wurkjen mei de AWS-ynfrastruktuer. Allinne der is in nuânse. Mei de tiid nimt it oantal omjouwings ta, funksjes ferskine yn elk. Ferskynt hast in kopy fan de applikaasje stack yn de oanbuorjende regio. En de Terraform-koade moat foarsichtich kopieare en bewurke wurde neffens de nije easken of om in snieflak te meitsjen.

Myn rapport giet oer patroanen yn Terraform om gaos en hânmjittich routine op grutte en lange projekten te bestriden.

Video:

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Ik bin 40, ik bin 20 jier yn IT. Ik wurkje al 12 jier by Ixtens. Wy binne dwaande mei e-commerce-oandreaune ûntwikkeling. En ik oefenje DevOps-praktiken foar 5 jier.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Myn ferhaal sil gean oer de ûnderfining yn in projekt yn in bedriuw waans namme ik sil net sizze, ferskûle efter in geheimhâlding oerienkomst.

De nûmers op 'e dia wurde jûn om de omfang fan it projekt te begripen. En alles wat ik neist sil sizze is relatearre oan Amazon.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Ik die mei oan dit projekt 4 jier lyn. En de werynrjochting fan ynfrastruktuer wie yn folle gong, om't it projekt groeid wie. En dy patroanen dy't brûkt waarden, se passe net mear. En sjoen alle plande groei fan it projekt, wie it nedich om te kommen mei wat nijs.

Mei tank oan Matvey, dy't ús juster fertelde wat der bard is by Dodo Pizza. Dit is wat ús 4 jier lyn barde.

Ûntwikkelers kamen en begûn te meitsjen ynfrastruktuer koade.

De meast foar de hân lizzende redenen wêrom't dit nedich wie, wie tiid om te merken. It wie nedich om te soargjen dat it DevOps-team gjin knipepunt wie by it útrollen. En ûnder oare Terraform en Puppet waarden brûkt op it alderearste nivo.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Terraform is in iepen boarne-projekt fan HashiCorp. En foar wa't net wit wat it is, de folgjende dia's.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Ynfrastruktuer as koade betsjut dat wy ús ynfrastruktuer kinne beskriuwe en guon robots kinne freegje om derfoar te soargjen dat wy de boarnen krije dy't wy beskreaun hawwe.

Wy hawwe bygelyks in firtuele masine nedich. Wy sille beskriuwe, tafoegje in pear fereaske parameters.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Dêrnei sille wy tagong ta Amazon yn 'e konsole konfigurearje. En freegje om Terraform-plan. Terraform-plan sil sizze: "Ok, foar jo boarne kinne wy ​​dizze dingen dwaan." En op syn minst ien boarne sil wurde tafoege. En gjin feroarings wurde ferwachte.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Neidat alles by jo past, kinne jo Terraform freegje oanfreegje en Terraform sil in eksimplaar foar jo meitsje, en jo krije in firtuele masine yn jo wolk.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Fierder ûntwikkelet ús projekt. Wy foegje dêr wat feroarings ta. Wy freegje om mear eksimplaren, wy foegje 53 ynstjoerings ta.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

En wy werhelje. Please plan. Wy sjogge hokker feroaringen pland binne. Tapasse. En sa groeit ús ynfrastruktuer.

Terraform brûkt sa'n ding as steatbestannen. Dat is, it bewarret alle wizigingen dy't nei Amazon geane yn in bestân, wêr't foar elke boarne dy't jo beskreaun binne, oerienkommende boarnen binne makke yn Amazon. Sa, by it feroarjen fan de beskriuwing fan in boarne, Terraform wit krekt wat moat wurde feroare yn Amazon.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Dizze steatbestannen wiene oarspronklik gewoan bestannen. En wy bewarre se yn Git, dat wie ekstreem ûngemaklik. Hieltyd fergeat immen feroarings te begean, en d'r wiene in protte konflikten.

No is it mooglik om de backend te brûken, d.w.s. Terraform wurdt oanjûn yn hokker bak, mei hokker kaai it steatbestân bewarre wurde moat. En Terraform sels sil soargje foar it krijen fan dit steatbestân, alle magy dwaan en it einresultaat weromsette.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Us ynfrastruktuer groeit. Hjir is ús koade. En no wolle wy net gewoan in firtuele masine meitsje, wy wolle in testomjouwing hawwe.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Terraform kinne jo meitsje sa'n ding as in module, dat wol sizze itselde ding yn guon map.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

En, bygelyks, yn testen, neame dizze module en krije itselde ding as as wy dogge Terraform tapasse yn de module sels. Hjir is de koade foar testen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Foar de produksje kinne wy ​​dêr wat feroarings stjoere, want by it testen hawwe wy gjin grutte eksimplaren nedich, by de produksje komme grutte eksimplaren fan pas.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

En dan gean ik werom nei it projekt. It wie in drege taak, de ynfrastruktuer wie pland hiel grut. En it wie nedich om op ien of oare manier alle koade te pleatsen sadat it foar elkenien handich wêze soe: foar dyjingen dy't ûnderhâld op dizze koade útfiere, en foar dyjingen dy't wizigingen meitsje. En it wie pland dat elke ûntwikkelder koe gean en de ynfrastruktuer reparearje as nedich foar syn diel fan it platfoarm.

Dit is in mapbeam dy't wurdt oanrikkemandearre troch HashiCorp as jo in grut projekt hawwe en it makket sin om de heule ynfrastruktuer yn guon lytse stikken te dielen, en elk stik yn in aparte map te beskriuwen.

Mei in wiidweidige boarnebibleteek kinne jo oer itselde belje yn testen en yn produksje.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Yn ús gefal wie dit net hielendal geskikt, om't de teststapel foar ûntwikkelders of foar testen op ien of oare manier ienfâldiger moast wurde krigen. En ik woe net gean troch de mappen en tapasse yn de juste folchoarder, en soargen dat de basis soe opstean, en dan soe it eksimplaar dat brûkt dizze basis soe opstean. Dêrom waarden alle testen lansearre út ien map. Deselde modules waarden dêr neamd, mar alles gie troch yn ien run.

Terraform soarget foar alle ôfhinklikens. En it makket altyd boarnen yn dy folchoarder, sadat jo in IP-adres kinne krije, bygelyks fan in nij oanmakke eksimplaar, en dit IP-adres krije yn 'e route53-yngong.

Derneist is it platfoarm tige grut. En it útfieren fan in teststapel, sels as foar in oere, sels as foar 8 oeren, is nochal in djoer bedriuw.

En wy hawwe dit bedriuw automatisearre. En de baan fan Jenkins liet de stapel rinne. It wie nedich om in pull-fersyk yn te starten mei de wizigingen dy't de ûntwikkelder testje wol, spesifisearje alle nedige opsjes, komponinten en grutte. As hy prestaasjestesten wol, dan kin hy mear eksimplaren nimme. As hy gewoan kontrolearje moat dat der in formulier iepenet, kin hy begjinne by it minimumlean. En ek oanjaan oft in kluster nedich is of net, ensfh.

En doe stjoerde Jenkins in shell-skript dat de koade in bytsje feroare yn 'e Terraform-map. Unnedige bestannen fuortsmiten, de nedige bestannen tafoege. En dan, mei ien run fan Terraform tapasse, kaam de stapel omheech.

En dan wiene der oare stappen dêr't ik net op yngean wol.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Fanwegen it feit dat wy foar testen wat mear opsjes nedich wiene as yn produksje, moasten wy kopyen meitsje fan 'e modules, sadat wy yn dizze kopyen dy funksjes tafoegje kinne dy't allinich yn testen nedich binne.

En it barde sa dat it yn testen liket as jo dy feroaringen wolle testen dy't úteinlik nei produksje sille gean. Mar yn feite waard ien ding hifke, en in bytsje oars waard brûkt yn produksje. En d'r wie in lytse brek yn it patroan dat yn produksje alle feroarings waarden tapast troch it operaasjeteam. En soms die bliken dat dy wizigingen dy't fan testen nei produksje gean moasten, se bleaunen yn in oare ferzje.

Dêrneist wie d'r sa'n probleem dat der in nije tsjinst bykaam, dy't wat oars wie as guon besteande. En ynstee fan in besteande module te wizigjen, moasten jo der in kopy fan meitsje en de nedige wizigingen tafoegje.

Yn feite is Terraform gjin echte taal. Dit is in ferklearring. As wy wat ferklearje moatte, dan ferklearje wy it. En it wurket allegear.

Op in stuit, by it besprekken fan ien fan myn pull-oanfragen, sei ien fan myn kollega's dat it net nedich is om snieflokken te produsearjen. Ik frege my ôf wat er bedoelde. D'r is sa'n wittenskiplik feit dat yn 'e wrâld gjin twa identike snieflokken binne, se binne allegear in bytsje, mar oars. En sa gau as ik dit hearde, fielde ik fuortendaliks it folsleine gewicht fan 'e Terraform-koade. Want doe't it wie nedich om te ferpleatsen fan ferzje nei ferzje, Terraform easke in breaking keatling feroaring, d.w.s. de koade wie net mear kompatibel mei de folgjende ferzje. En ik moast in pull-fersyk meitsje, dy't hast de helte fan de bestannen yn 'e ynfrastruktuer befette, om de ynfrastruktuer nei de folgjende ferzje fan Terraform te bringen.

En nei't sa'n snieflak ferskynde, alle Terraform-koade dy't wy hiene feroare yn in grutte, grutte steapel snie.

Foar in eksterne ûntwikkelder dy't bûten wurking is, makket it him net folle út, om't hy in pull-oanfraach makke, syn boarne begon. En dat is it, it is net syn soarch. En it DevOps-team dat soarget dat alles goed is, moat al dizze wizigingen meitsje. En de kosten fan dizze feroarings tanommen hiel, hiel folle mei elke ekstra snieflokken.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

D'r is in ferhaal oer hoe't in studint op in seminar twa perfekte sirkels tekenet mei krijt op in swartboerd. En de learaar is fernuvere hoe't it slagge om te tekenjen sa soepel sûnder in kompas. De studint antwurdet: "It is heul ienfâldich, ik draaide in fleismolen foar twa jier yn it leger."

En fan de fjouwer jier dat ik mei dit projekt bin, doch ik al sa'n twa jier Terraform. En, fansels, ik haw wat trúkjes, wat tips oer hoe't jo de Terraform-koade ferienfâldigje, dermei wurkje as in programmeartaal en de lêst ferminderje op ûntwikkelders dy't dizze koade by de tiid moatte hâlde.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

It earste ding dat ik graach begjinne mei is Symlinks. Terraform hat in protte repetitive koade. Bygelyks, in provider belje op hast elk punt wêr't wy in stik ynfrastruktuer meitsje is itselde. En it is logysk te setten it yn in aparte daddy. En wêr't de provider ek ferplicht is om Symlinks nei dit bestân te meitsjen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Jo brûke bygelyks oannimme rol yn produksje, wêrtroch jo tagongsrjochten kinne krije foar guon eksterne Amazon-akkounts. En troch ien bestân te feroarjen, sille alle oerbleaune dy't yn 'e boarnebeam binne de fereaske rjochten hawwe, sadat Terraform wit hokker Amazon-segment tagong hat.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Wêr Symlinks net wurkje? Lykas ik sei, Terraform hat steat triemmen. En se binne heul, heul cool. Mar it feit is dat Terraform de efterkant inisjalisearret yn 'e alderearste. En hy kin gjin fariabelen brûke yn dizze parameters, se moatte altyd yn tekst skreaun wurde.

En as gefolch, as immen in nije boarne makket, kopiearret hy in diel fan 'e koade út oare mappen. En hy kin in flater meitsje mei de kaai of mei de bak. Hy makket bygelyks in sânbak ding fan in sânbox, en makket it dan yn produksje. En sa kin bliken dien dat de bak yn produksje wurdt brûkt út de sânbak. Fansels fine se it gau. It sil mooglik wêze om dit op ien of oare manier te reparearjen, mar dochs is it in fergriemerij fan tiid en, foar in part, middels.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Wat kinne wy ​​dan dwaan? Foardat jo wurkje mei Terraform, moatte jo it inisjalisearje. Op it momint fan inisjalisaasje download Terraform alle plugins. Op in stuit bruts se fan in monolith yn in mear mikroservice-arsjitektuer. En jo moatte altyd Terraform init dwaan sadat it alle modules oplûkt, alle plugins.

En jo kinne in shell-skript brûke, dat as earste alle fariabelen kin krije. Shell-skript is ûnbeheind. En, twadde, de wei. As wy altyd it paad brûke dat yn 'e repository is as de kaai foar it steatbestân, dan sil de flater hjirmei útsletten wurde.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Wêr te krijen gegevens? JSON triem. Terraform lit jo ynfrastruktuer net allinich skriuwe yn hcl (HashiCorp Configuration Language), mar ek yn JSON.

JSON is maklik te lêzen fanút in shellskript. Dêrtroch kinne jo op ien of oare plak in konfiguraasjetriem mei in emmer pleatse. En brûk dizze bak sawol yn 'e Terraform-koade as yn it shell-skript foar inisjalisaasje.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Wêrom is it wichtich om in Terraform-emmer te hawwen? Om't d'r sa'n ding is as bestannen op ôfstân. Dat is, as ik wat boarne ophelje, om Amazon te fertellen: "Please raise instance", Ik moat in protte fereaske parameters opjaan.

En dizze identifiers wurde opslein yn in oare map. En ik kin it nimme en sizze: "Terraform, rinne asjebleaft nei it steatsbestân fan dy eigen boarne en krij my dizze identifiers." En sa is der in soarte fan ienwurding tusken ferskate regio's of omjouwings.

It is net altyd mooglik om in bestân op ôfstân te brûken. Jo hawwe bygelyks in VPC mei de hân makke. En de Terraform-koade dy't de VPC makket, makket sa'n oare VPC dat it in heul lang duorret en jo moatte de iene oan 'e oare oanpasse, sadat jo de folgjende trúk brûke kinne.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Dat is, om in module te meitsjen dy't, as it wie, makket VPC en jout jo identifiers, mar yn feite is d'r gewoan in bestân mei hurdkodearre wearden dy't kin wurde brûkt om deselde eksimplaar te meitsjen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

It is net altyd nedich om it steatbestân yn 'e wolk te bewarjen. Bygelyks, by it testen fan modules, kinne jo backend-initialisaasje brûke, as it bestân krekt op skiif opslein wurdt op it momint fan testen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

No in bytsje oer testen. Wat kin wurde hifke yn Terraform? Wierskynlik is in protte mooglik, mar ik sil oer dizze 4 dingen prate.

HashiCorp hat in begryp fan hoe't jo Terraform-koade opmeitsje. En Terraform fmt lit jo de koade opmaak dy't jo bewurkje neffens dat leauwe. Dêrom moatte de tests needsaaklikerwize kontrolearje oft de opmaak oerienkomt mei wat HashiCorp neilitten hat, sadat jo de lokaasje fan heakjes net hoege te feroarjen, ensfh.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

De folgjende is Terraform validate. It docht in bytsje mear dan in syntaksiskontrôle - ala, binne alle heakjes keppele. Wat is hjir wichtich? Wy hawwe in tige tinne ynfrastruktuer. It hat in protte ferskillende mappen. En yn elk moatte jo Terraform falidearje útfiere.

Dêrom, om testen te fersnellen, rinne wy ​​ferskate prosessen parallel mei parallel.

Parallel is in heul cool ding, brûk it.

Mar elke kear as Terraform wurdt inisjalisearre, giet it nei HashiCorp en freget: "Wat binne de lêste plugins? En de plugin dy't ik yn 'e cache haw - is it de iene of net de iene? En it fertrage by elke stap.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

As Terraform jo fertelt wêr't de plugins binne, sil Terraform sizze: "OK, dit is wierskynlik it nijste ding dat der is. Ik gean nergens hinne, ik sil daliks begjinne mei it falidearjen fan jo Terraform-koade."

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Om de map te foljen mei de nedige plugins, hawwe wy in heul ienfâldige Terraform-koade dy't gewoan inisjalisearre wurde moat. Hjir moatte jo fansels alle oanbieders opjaan dy't op ien of oare manier meidwaan oan jo koade, oars sil Terraform sizze: "Ik wit gjin provider, om't it net yn 'e cache is."

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

De folgjende is it Terraform-plan. As ik sei, ûntwikkeling is cyclysk. Wy meitsje koade mei feroarings. En dan moatte jo útfine hokker feroarings binne pland foar de ynfrastruktuer.

En as de ynfrastruktuer heul, heul grut is, kinne jo ien module feroarje, wat testomjouwing of in spesifike regio reparearje, en guon oanbuorjende ien brekke. Dêrom moat foar de hiele ynfrastruktuer in Terraform-plan makke wurde en sjen litte hokker feroarings der pland binne.

Jo kinne it op 'e tûke manier dwaan. Wy hawwe bygelyks in Python-skript skreaun dat ôfhinklikens oplost. En ôfhinklik fan wat feroare is: in Terraform-module of gewoan in spesifike komponint, makket it plannen foar alle ôfhinklike mappen.

Terraform plan moat dien wurde op oanfraach. Alteast dat dogge wy.

Tests binne fansels goed om te dwaan foar elke feroaring, foar elke commit, mar plannen binne nochal in djoer ding. En wy sizze yn it pull-fersyk: "Jou my asjebleaft de plannen." De robot begjint. En stjoert nei de opmerkingen of taheakje alle plannen dy't wurde ferwachte út jo feroarings.

It plan is in frij djoer ding. It duorret tiid om't Terraform nei Amazon giet en freget: "Bestiet dit eksimplaar noch? Hat dizze autoscale krekt deselde parameters?”. En om it te rapperjen, kinne jo in parameter brûke lykas refresh=false. Dit betsjut dat Terraform de S3 steat sil deflate. En sil leauwe dat de steat krekt oerienkomt mei wat yn Amazon is.

Sa'n Terraform-plan is folle flugger, mar de steat moat oerienkomme mei jo ynfrastruktuer, d.w.s. earne, soms moat Terraform-ferfarsking begjinne. Terraform refresh docht dat krekt, sadat de steat oerienkomt mei wat der yn de echte ynfrastruktuer sit.

En ik moat sizze oer feiligens. Dit is wêr't it begjinne moat. Wêr't jo Terraform útfiere en Terraform wurket mei jo ynfrastruktuer, is d'r in kwetsberens. Dat is, jo útfiere yn wêzen koade. En as it pull-fersyk in soarte fan kweade koade befettet, dan kin it útfierd wurde op in ynfrastruktuer dy't tefolle tagong hat. Wês dêrom foarsichtich wêr't jo Terraform-plan lansearje.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

It folgjende ding wêr't ik oer prate wol is testen fan brûkersgegevens.

Wat binne brûkersgegevens? Yn Amazon, as wy in eksimplaar oanmeitsje, kinne wy ​​in soarte fan brief fan it eksimplaar stjoere - metagegevens. As in eksimplaar is begon, is gewoanlik wolk init altyd oanwêzich op dy eksimplaren. Cloud init lêst dizze brief en seit: "OK, hjoed bin ik in load balancer." En yn oerienstimming mei dizze foarskriften docht hy guon aksjes.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Mar, spitigernôch, as wy Terraform-plan dogge en Terraform tapasse, sjogge brûkersgegevens as dizze slurry fan nûmers. Dat is, hy stjoert jo gewoan in hash. En alles wat jo kinne sjen yn it plan is oft d'r feroaringen sille wêze of dat de hash itselde bliuwt.

En as jo dit net betelje, dan kin wat slein tekstbestân nei Amazon gean, nei de echte ynfrastruktuer.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

As alternatyf kinne jo net de hiele ynfrastruktuer opjaan by útfiering, mar allinich it sjabloan. En yn 'e koade, sis: "Lit dizze sjabloan asjebleaft foar my sjen." En as resultaat kinne jo in ôfdruk krije fan hoe't jo gegevens der útsjen sille op Amazon.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

In oare opsje is om in module te brûken om brûkersgegevens te generearjen. Jo sille dizze module tapasse. Krij it bestân op skiif. Ferlykje it mei de referinsje. En dus, as guon jun beslute om in bytsje brûkersgegevens te reparearjen, dan sille jo tests sizze: "OK, d'r binne hjir en dêr wat feroaringen - dit is normaal."

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

It folgjende ding wêr't ik oer prate wol is Automate Terraform tapasse.

Fansels, it is eng genôch te dwaan Terraform tapasse yn automatyske modus, want wa wit hokker feroarings binne kommen dêr en hoe skealik se kinne wêze foar in libbene ynfrastruktuer.

Foar in testomjouwing is dit allegear goed. Dat is, in baan dy't in testomjouwing skept is wat alle ûntwikkelders nedich binne. En sa'n útdrukking as "alles wurke foar my" is net in grappich meme, mar bewiis dat in persoan waard betize, ferhege in stack, lansearre guon tests op dizze stack. En hy soarge derfoar dat alles dêr goed wie en sei: "OK, de koade dy't ik frijjouwe is hifke."

Yn produksje, sânbak en oare omjouwings dy't mear saaklik kritysk binne, is it feilich om guon boarnen foar in part te brûken, om't it gjinien feroarsaket. Dit binne: autoscale groepen, feiligens groepen, rollen, route53 en dêr kin de list frij grut wêze. Mar hâld in each op wat der bart, lês rapporten fan automatisearre applikaasjes.

Wêr't it gefaarlik of skriklik is om te brûken, bygelyks as dit wat persistente boarnen binne, fan in databank, krije dan rapporten dat d'r net tapaste feroarings binne yn guon stik ynfrastruktuer. En de yngenieur is al tafersjoch op it útfieren fan banen om it oan te passen of te dwaan fan syn konsole.

Amazon hat sa'n ding as Terminate-beskerming. En it kin yn guon gefallen beskermje tsjin feroaringen dy't net foar jo nedich binne. Dat Terraform gie nei Amazon en seit "Ik moat dizze eksimplaar deadzje om in oare te meitsjen". En Amazon seit: "Sorry, net hjoed. Wy hawwe Terminate-beskerming. ”

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

En de kers op 'e taart is koade-optimalisaasje. As wy wurkje mei Terraform koade, wy moatte trochjaan in hiel grut oantal parameters oan de module. Dit binne de parameters dy't nedich binne om in soarte fan boarne te meitsjen. En de koade feroaret yn grutte listen fan parameters dy't moatte wurde trochjûn fan module nei module, fan module nei module, benammen as de modules binne nested.

En it is heul lestich om te lêzen. It is heul lestich om dit te besjen. En hiel faak docht bliken dat guon parameters wurde hifke en se binne net hielendal dejingen dy't nedich binne. En it kostet tiid en jild om it letter te reparearjen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Dêrom stel ik foar dat jo sa'n ding brûke as in komplekse parameter dy't in bepaalde beam fan wearden omfettet. Dat is, jo hawwe in soarte map nedich wêr't jo alle wearden hawwe dy't jo wolle hawwe yn in soarte fan omjouwing.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

En troch dizze module te neamen, kinne jo in beam krije dy't wurdt generearre yn ien mienskiplike module, dat is, yn in mienskiplike module dy't itselde wurket foar de hiele ynfrastruktuer.

Yn dizze module kinne jo wat berekkeningen dwaan mei sa'n frisse funksje yn Terraform as lokale befolking. En dan yn ien útfier in soarte fan komplekse parameter útjaan, dy't hashes, arrays, ensfh.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Op dit, al de bêste fynsten dy't ik haw einige. En ik soe graach fertelle in ferhaal oer Columbus. Doe't er jild socht foar syn ekspedysje om Yndia te ûntdekken (sa't er doe tocht), leaude gjinien him en leaude dat dit ûnmooglik wie. Doe sei er: "Soargje dat it aai net falt." Alle bankiers, tige rike en wierskynlik tûke minsken, besochten it aai op ien of oare manier te setten, en it foel hieltyd. Doe naem Columbus it aai, drukte it in bytsje. De skulp ferfrommele en it aai bleau roerleas. Se seine: "Och, dat is te maklik!" En Columbus antwurde: "Ja, it is te ienfâldich. En as ik Yndia iepenje, sil elkenien dizze hannelsrûte brûke.

En wat ik jo krekt ferteld haw binne wierskynlik frij ienfâldige en triviale dingen. En as jo der oer leare en se begjinne te brûken, is it yn 'e folchoarder fan dingen. Dus brûk it. En as dit foar jo gewoan normale dingen binne, dan wite jo teminsten hoe't jo in aai sette dat it net falt.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Litte wy it opnimme:

  • Besykje snieflokken te foarkommen. En hoe minder snieflokken, de minder boarnen dy't jo nedich binne om feroaringen oan jo heule grutte ynfrastruktuer te meitsjen.
  • Konstante feroaring. Dat is, as guon feroarings yn 'e koade binne bard, moatte jo jo ynfrastruktuer sa gau mooglik yn oerienstimming bringe mei dizze wizigingen. Der moat gjin situaasje wêze as immen yn twa of trije moannen komt om Elasticsearch te sjen, in Terraform-plan makket, en d'r binne in protte feroaringen dy't hy net ferwachte. En it kostet in soad tiid om alles wer op oarder te setten.
  • Tests en automatisearring. Hoe mear jo koade is bedekt mei tests en chips, hoe mear fertrouwen jo hawwe dat jo alles goed dogge. En automatyske levering sil jo fertrouwen in protte kearen ferheegje.
  • De koade foar de test- en produksjeomjouwing moat hast itselde wêze. Praktysk, want de produksje is ommers wat oars en der sille noch wol wat nuânses wêze dy't boppe de testomjouwing geane. Mar nettsjinsteande, plus of min kin it oanbean wurde.
  • En as jo in protte Terraform-koade hawwe en it duorret in protte tiid om dizze koade bywurke te hâlden, dan is it noait te let om it te refaktorearjen en yn goede foarm te bringen.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

  • ûnferoarlike ynfrastruktuer. AMI levering op skema.
  • Struktuer foar route53 as jo in protte yngongen hawwe en wolle dat se yn in konsekwinte folchoarder binne.
  • Fjochtsje tsjin API-rategrinzen. Dit is as Amazon seit: "Dat is it, ik kin gjin oanfragen mear akseptearje, wachtsje asjebleaft." En de helte fan it kantoar wachtet oant it syn ynfrastruktuer kin lansearje.
  • spot eksimplaren. Amazon is gjin goedkeap evenemint en spots kinne jo in soad besparje. En dêr kinne jo in hiele reportaazje oer fertelle.
  • Feiligens en IAM rollen.
  • Sykje nei ferlerne boarnen, as jo eksimplaren hawwe fan ûnbekende komôf yn Amazone, ite se jild. Sels as eksimplaren $ 100-150 per moanne kostje, is it mear dan $ 1 per jier. Sokke boarnen fine is in lukratyf bedriuw.
  • En reservearre eksimplaren.

Patroanen yn Terraform om gaos en manuele routine te bestriden. Maxim Kostrikin (Ixtens)

Dat is alles foar my. Terraform is heul cool, brûk it. Dankewol!

Jo fragen

Tank foar it ferslach! Jo hawwe in steat triem yn S3, mar hoe oplosse jo it probleem dat ferskate minsken kinne nimme dizze steat triem en besykje te ynsette?

Earst hawwe wy gjin haast. As twadde binne der flaggen, wêryn't wy melde dat wy wurkje oan wat stik koade. Dat wol sizze, nettsjinsteande it feit dat de ynfrastruktuer tige grut is, betsjut dit net dat immen hieltyd wat brûkt. En as d'r in aktive faze wie, wie dit in probleem, wy hâlden steatbestannen yn Git. Dit wie wichtich, oars makke immen in steatsbestân, en wy moasten se mei de hân op in heap sammelje om fierder te gean. No is der gjin sa'n probleem. Yn 't algemien hat Terraform dit probleem oplost. En as der hieltyd wat feroaret, dan kinne jo slûzen brûke dy't foarkomme wat jo sein hawwe.

Brûk jo iepen boarne as bedriuw?

Gjin ûndernimming, dat is alles wat jo kinne gean en fergees downloade.

Myn namme is Stanislav. Ik woe in lytse oanfolling meitsje. Jo hawwe it oer de Amazon-funksje wêrmei jo in eksimplaar unkillable meitsje kinne. Dit is ek yn Terraform sels, yn it Life Second blok, kinne jo foarskriuwe in ferbod op feroaring, of in ferbod op ferneatiging.

Wie beheind yn 'e tiid. Goed punt.

Ik woe ek twa dingen freegje. Earst hawwe jo it oer testen. Hawwe jo testynstruminten brûkt? Ik hearde oer de Test Kitchen plugin. Miskien is der wat oars. En ik soe graach freegje oer Lokale Wearden. Hoe ferskille se yn prinsipe fan ynfierfariabelen? En wêrom kin ik wat net parametrisearje allinich fia Local Values? Ik besocht dit ûnderwerp te behanneljen, mar op ien of oare manier haw ik it sels net útfûn.

Wy kinne prate yn mear detail efter dizze seal. Testynstruminten binne ús folsleine selsmakke. D'r is neat te testen. Yn it algemien binne d'r opsjes as automatyske tests de ynfrastruktuer earne ferheegje, kontrolearje dat it OK is, en dan alles ferneatigje mei in rapport dat jo ynfrastruktuer noch yn goede foarm is. Dat hawwe wy net om't de teststapels alle dagen rinne. En dat is genôch. En as der wat begjint te brekken, dan sil it begjinne te brekken sûnder dat wy it earne oars kontrolearje.

Oangeande pleatslike wearden, litte wy it petear trochgean bûten it publyk.

Hallo! Tank foar it ferslach! Hiel ynformatyf. Jo hawwe sein dat jo in protte fan itselde type koade hawwe om de ynfrastruktuer te beskriuwen. Hawwe jo beskôge dizze koade te generearjen?

Geweldige fraach, tank! It punt is dat as wy ynfrastruktuer as koade brûke, wy oannimme dat wy nei de koade sjogge en begripe hokker soarte ynfrastruktuer efter dizze koade leit. As de koade wurdt generearre, dan moatte wy yntinke hokker koade sil wurde generearre om te begripen hokker soarte fan ynfrastruktuer sil wêze dêr. Of wy generearje de koade, commit it en, yn feite, wy krije itselde ding. Dêrom gongen wy sa't wy skreaunen, wy krigen it. Plus, generators ferskynden in bytsje letter, doe't wy begûn te meitsjen. En it wie te let om te feroarjen.

Hawwe jo heard fan jsonnet?

No.

Sjoch, dit is echt cool spul. Ik sjoch in spesifyk gefal wêr't jo it kinne tapasse en in gegevensstruktuer generearje.

Generators binne goed as jo se hawwe, lykas yn 'e grap oer de scheermasine. Dat is, de earste kear is it gesicht oars, mar dan hat elkenien itselde gesicht. De generators binne heul cool. Mar, spitigernôch, ús gesichten binne in bytsje oars. Dit is probleem.

Sjoch mar. Dankewol!

Myn namme is Maxim, ik kom fan Sberbank. Jo seine in bytsje dat jo besocht te bringen Terraform ta in analoog fan in programmeartaal. Is it net makliker om Ansible te brûken?

Dit binne hiel ferskillende dingen. Ansible kin boarnen oanmeitsje, en Puppet kin boarnen oanmeitsje yn Amazon. Mar Terraform is suver skerper.

Hawwe jo allinich Amazon?

It is net dat wy allinich Amazon hawwe. Wy hawwe hast allinnich Amazon. Mar de kaai funksje is dat Terraform ûnthâld. Yn Ansible, as jo sizze: "Pak my 5 eksimplaren op", dan sil it ferheegje, en dan sizze jo: "En no haw ik 3 nedich". En Terraform sil sizze: "Ok, ik sil 2 deadzje", en Ansible sil sizze: "Ok, hjir binne 3 foar jo." Totaal 8.

Hallo! Tank foar dyn rapport! It wie tige nijsgjirrich om te hearren oer Terraform. Ik wol gewoan in lyts opmerking meitsje oer it feit dat Terraform noch altyd gjin stabile release hat, dus wês tige foarsichtich mei Terraform.

Moaie leppel foar iten. Dat is, as jo in oplossing nedich hawwe, dan stelle jo soms wat ynstabyl is, ensfh., mar it wurket en hat ús holpen.

De fraach is. Jo brûke de Remote backend, jo brûke S 3. Wêrom brûke jo de offisjele backend net?

Offisjeel?

Terraform Cloud.

Wannear ferskynde hy?

4 moanne lyn.

As it 4 jier lyn ferskynde, dan, wierskynlik, soe ik jo fraach beäntwurde hawwe.

Der is al in ynboude funksje en slûzen, en jo kinne opslaan in steat triem. Besykje it. Mar ik haw ek net testen.

Wy sitte op in grutte trein dy't mei hege snelheid beweecht. En do kinst net samar nimme en smyt út in pear auto.

Jo hiene it oer snieflokken, wêrom hawwe jo gjin branch brûkt? Wêrom gie it net sa?

Wy hawwe sa'n oanpak dat de hiele ynfrastruktuer yn ien repository is. Terraform, Puppet, alle skripts dy't hjirmei relatearje, se binne allegear yn ien repository. Op dizze manier kinne wy ​​derfoar soargje dat inkrementele feroarings ien foar ien wurde hifke. As it in bulte tûken wie, dan soe sa'n projekt hast net te ûnderhâlden wêze. Seis moanne geane foarby, en se ferskille sa folle dat it gewoan in soarte fan straf is. Dit is wêr't ik foar fuortgean woe foardat ik refaktorearje.

d.w.s. it wurket net?

It wurket hielendal net.

Yn tûke knip ik de mapslide út. Dat is, as jo dogge foar eltse test stack, bygelyks, team A hat syn eigen daddy, team B hat syn eigen daddy, dan dit ek net wurket. Wy makken in unifoarme testomjouwingskoade dy't fleksibel genôch wie om elkenien te passen. Dat is, wy tsjinne ien koade.

Hallo! Myn namme is Yura! Tank foar it ferslach! Fraach oer modules. Jo sizze dat jo modules brûke. Hoe losse jo it probleem op as feroaringen makke binne yn ien module dy't net kompatibel binne mei de feroaring fan in oare persoan? Op ien of oare manier ferzjes fan modules of besykje in wûnderkind te bringen om oan twa easken te foldwaan?

Dit is de grutte snie peal probleem. Dit is wêr't wy lêst fan hawwe as guon ûnskuldige feroaring in diel fan 'e ynfrastruktuer kin brekke. En it sil pas nei in lange tiid merkber wêze.

Dat is, it is noch net besletten?

Jo meitsje universele modules. Foarkom snieflokken. En alles sil goed komme. De twadde helte fan it rapport giet oer hoe't jo it foarkomme kinne.

Hallo! Tank foar it ferslach! Ik soe graach dúdlik meitsje. Efter de skermen wie der in grutte peal, dêr't ik foar kaam. Hoe binne Puppet en rolferdieling yntegrearre?

brûkersgegevens.

Dat is, spuie jo gewoan it bestân út en útfiere jo der op ien of oare manier op?

User-data is in notysje, dat wol sizze as wy in ôfbyldingsklon meitsje, dan komt Daemon dêr op en besiket út te finen wa't hy is, lêst in notysje dat hy in load balancer is.

Dat is, is it in soarte fan apart proses dat fuortjûn wurdt?

Wy hawwe it net útfûn. Wy brûke it.

Hallo! Ik haw gewoan in fraach oer User - data. Jo seine dat der problemen binne, dat immen miskien wat nei it ferkearde plak stjoere. Is d'r ien of oare manier om brûker - gegevens op te slaan yn deselde Git, sadat it altyd dúdlik is wêr't brûker-gegevens nei ferwize?

Wy generearje brûkersgegevens fan sjabloan. Dat is, in bepaald oantal fariabelen resort dêr. En Terraform genereart it einresultaat. Dêrom kinne jo net gewoan nei it sjabloan sjen en sizze wat der bart, om't alle problemen binne relatearre oan it feit dat de ûntwikkelder tinkt dat hy in tekenrige yn dizze fariabele trochjaan, en dan wurdt in array brûkt. En hy - bang en ik - sa-en-sa, sa-en-sa, de folgjende rigel, en alles bruts. As dit in nije boarne is en in persoan ferheget it, sjocht dat der wat net wurket, dan wurdt dit fluch oplost. En as dizze autoscale-groep is bywurke, dan begjinne op in stuit de eksimplaren yn 'e autoscale-groep te ferfangen. En klap, wat wurket net. It docht sear.

It docht bliken dat de ienige oplossing is om te testen?

Ja, jo sjogge it probleem, jo ​​foegje teststappen dêr ta. Dat is, output kin ek hifke wurde. Miskien net sa handich, mar jo kinne ek wat markearrings pleatse - kontrolearje dat brûkersgegevens hjir binne nagele.

Myn namme is Timur. It is heul cool dat d'r rapporten binne oer hoe Terraform goed te organisearjen.

Ik bin net iens begûn.

Ik tink dat der yn 'e folgjende konferinsje miskien wêze sil. Ik haw in ienfâldige fraach. Wêrom hardkodearje jo de wearde yn in aparte module ynstee fan tfvars te brûken, d.w.s. is in module mei wearden better dan tfvars?

Dat is, ik moat skriuwe hjir (slide: Production/environment/settings.tf): domein = fariabele, domein vpcnetwork, vpcnetwork fariabele en stvars - krije itselde ding?

Dat dogge wy krekt. Wy ferwize nei de ynstelling boarne module, bygelyks.

Eins is dit sa'n tfvars. Tfvars is tige handich yn in testomjouwing. Ik haw tfvars foar grutte eksimplaren, foar lytse. En ik smiet ien bestân yn 'e map. En krige wat ik woe. As wy ynfrastruktuer seagen, wolle wy alles sjen en daliks begripe. En sa docht bliken dat jo hjir ris sjen moatte, dan yn tfvars sjen.

It docht bliken dat alles wie op ien plak?

Ja, tfvars is as jo ien koade hawwe. En it wurdt brûkt op ferskate ferskillende plakken mei ferskillende nuânses. Dan soene jo tfvars goaie en jo nuânses krije. En wy binne ynfrastruktuer as koade yn syn suverste foarm. Sjoch en begrepen.

Hallo! Binne jo situaasjes tsjinkaam wêr't de wolkprovider ynterfereart mei wat jo mei Terraform dien hawwe? Litte wy sizze dat wy de metagegevens bewurkje. D'r binne ssh-toetsen. En Google slûpt konstant syn meta-data, syn kaaien dêr. En Terraform skriuwt altyd dat it feroarings hat. Nei elke run, sels as der neat feroaret, seit er altyd dat hy dit fjild no bywurkje sil.

Mei kaaien, mar - ja, in part fan de ynfrastruktuer wurdt beynfloede troch soks, dus Terraform kin neat feroarje. Wy kinne ek neat mei de hannen feroarje. Salang't wy der mei libje.

Dat is, jo kamen dit tsjin, mar kaam neat op, hoe docht er it en docht it sels?

Spitigernôch ja.

Hallo! Myn namme is Stanislav Starkov. Post. en Group. Hoe losse jo it probleem op mei it generearjen fan in tag op ..., hoe passe jo it binnen? Sa't ik it begryp, troch Brûker - gegevens, om de hostnamme oan te jaan, stimulearje Puppet? En it twadde diel fan 'e fraach. Hoe kinne jo dit probleem oplosse yn SG, dus as jo SG generearje, hûndert eksimplaren fan itselde type, hoe kinne jo se korrekt neame?

Dy eksimplaren dy't foar ús tige wichtich binne, sille wy se moai neame. Dejingen dy't net nedich binne, is in neiskrift dat dit in autoscale groep is. En yn teory kin it spikere wurde, en in nije krije.

As foar it probleem mei de tag, der is gjin sa'n probleem, mar der is sa'n taak. En wy brûke tags tige, heul swier, om't de ynfrastruktuer grut en djoer is. En wy moatte sjen wêr't jild oan wurdt bestege, dus tags kinne ús sortearje wat en wêr't it gie. En sadwaande is it sykjen nei wat hjir in protte jild bestege.

Wêr gie de fraach oars oer?

As SG hûndert eksimplaren makket, moatte se dan op ien of oare manier ûnderskiede wurde?

Nee, net dwaan. Elke eksimplaar hat in agent dy't my fertelt dat ik in probleem haw. As de agent rapportearret, dan wit de agent oer him en, op syn minst, syn IP-adres bestiet. Jo kinne al rinne. Twadder brûke wy Consul for Discovery, wêr't gjin Kubernetes is. En Consul toant ek it IP-adres fan 'e eksimplaar.

Dat is, jo rjochtsje jo krekt op it IP, en net de hostnamme?

It is ûnmooglik om te navigearjen op hostnamme, d.w.s. d'r binne in protte fan harren. Der binne eksimplaar identifiers - AE, ensfh Jo kinne fine it earne, kinne jo smite it yn it sykjen.

Hallo! Ik realisearre dat Terraform in goede saak is, ôfstimd op 'e wolken.

Net allinnich.

Dit is de fraach dy't my ynteressearret. As jo ​​beslute om te ferhúzjen, sis mar, massaal nei Bare Metal mei al jo eksimplaren? Sille d'r gjin problemen wêze? Of moatte jo noch oare produkten brûke, bygelyks deselde Ansible dy't hjir neamd waard?

Ansible giet in bytsje oer wat oars. Dat is, Ansible rint al as it eksimplaar is begon. En Terraform wurket foardat de eksimplaar begon is. Oerskeakelje nei Bare Metal is net.

No net, mar it bedriuw sil komme en sizze: "Kom mar."

Oerskeakelje nei in oare wolk - ja, mar d'r is hjir in wat oare funksje. Jo moatte Terraform-koade skriuwe op sa'n manier dat jo kinne oerstappe nei in oare wolk mei minder bloedfergieten.

Yn earste ynstânsje wie de taak dat ús hiele ynfrastruktuer agnostysk is, dus elke wolk soe geskikt wêze moatte, mar op in stuit joech it bedriuw op en sei: "OK, yn 'e kommende N jier sille wy net oeral gean, jo kinne Amazon-tsjinsten brûke " .

Terraform kinne jo meitsje Front-End banen, configure PagerDuty, data docs, ensfh It hat in protte tails. Hy kin de hiele wrâld praktysk kontrolearje.

Tank foar it ferslach! Ik spin ek al 4 jier Terraform. Op it poadium fan in soepele oergong nei Terraform, nei ynfrastruktuer, nei in deklarative beskriuwing, waarden wy konfrontearre mei in situaasje wêryn't immen wat mei de hân die, en jo besochten in plan te meitsjen. En dêr krige ik wat flater. Hoe geane jo om mei sokke problemen? Hoe fine jo de ferlerne middels dy't waarden oanjûn?

Meast mei ús hannen en eagen, as wy wat nuver yn it rapport sjogge, dan analysearje wy wat der bart, of wy deadzje it gewoan. Yn 't algemien binne pull-oanfragen in gewoan ding.

As d'r in flater is, rôlje jo dan werom? Hawwe jo besocht dit te dwaan?

Nee, dit is in beslút fan in persoan op it momint dat hy it probleem sjocht.

Boarne: www.habr.com