Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det verkar som att Terraform-utvecklarna erbjuder ganska bekvÀma bÀsta metoder för att arbeta med AWS-infrastrukturen. Bara det finns en nyans. Med tiden ökar antalet miljöer, funktioner visas i varje. Visas nÀstan en kopia av applikationsstacken i den angrÀnsande regionen. Och Terraform-koden mÄste noggrant kopieras och redigeras enligt de nya kraven eller för att göra en snöflinga.

Min rapport handlar om mönster i Terraform för att bekÀmpa kaos och manuell rutin pÄ stora och lÄnga projekt.

videor:

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Jag Àr 40, jag har jobbat med IT i 20 Är. Jag har arbetat pÄ Ixtens i 12 Är. Vi Àr engagerade i e-handelsdriven utveckling. Och jag har praktiserat DevOps-övningar i 5 Är.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Min berÀttelse kommer att handla om upplevelsen i ett projekt i ett företag vars namn jag inte kommer att sÀga, gömmer sig bakom ett sekretessavtal.

Siffrorna pÄ bilden ges för att förstÄ omfattningen av projektet. Och allt jag ska sÀga hÀrnÀst Àr relaterat till Amazon.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Jag gick med i detta projekt för 4 Är sedan. Och omstruktureringen av infrastrukturen var i full gÄng, eftersom projektet hade vÀxt. Och de dÀr mönstren som anvÀndes, de passar inte lÀngre. Och med tanke pÄ all planerad tillvÀxt av projektet var det nödvÀndigt att komma med nÄgot nytt.

Tack till Matvey, som berÀttade igÄr vad som hÀnde pÄ Dodo Pizza. Detta Àr vad som hÀnde oss för 4 Är sedan.

Utvecklare kom och började göra infrastrukturkod.

De mest uppenbara anledningarna till att detta krÀvdes var time to market. Det var nödvÀndigt att se till att DevOps-teamet inte var en flaskhals vid utrullningen. Och bland annat anvÀndes Terraform och Puppet pÄ den allra första nivÄn.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Terraform Àr ett open source-projekt frÄn HashiCorp. Och för de som inte alls vet vad det Àr, de kommande bilderna.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Infrastruktur som kod innebÀr att vi kan beskriva vÄr infrastruktur och be nÄgra robotar att se till att vi fÄr de resurser som vi beskrev.

Till exempel behöver vi en virtuell maskin. Vi kommer att beskriva, lÀgga till nÄgra nödvÀndiga parametrar.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Efter det kommer vi att konfigurera Ätkomst till Amazon i konsolen. Och frÄga efter Terraform-plan. Terraform plan kommer att sÀga: "Ok, för din resurs, vi kan göra dessa saker." Och minst en resurs kommer att lÀggas till. Och inga förÀndringar förvÀntas.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Efter att allt passar dig kan du be Terraform ansöka sÄ skapar Terraform en instans Ät dig, och du fÄr en virtuell maskin i ditt moln.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Vidare utvecklas vÄrt projekt. Vi lÀgger till nÄgra Àndringar dÀr. Vi ber om fler instanser, vi lÀgger till 53 poster.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Och vi upprepar. Planera gÀrna. Vi ser vilka förÀndringar som planeras. TillÀmpa. Och sÄ vÀxer vÄr infrastruktur.

Terraform anvÀnder nÄgot sÄdant som tillstÄndsfiler. Det vill sÀga, den sparar alla Àndringar som gÄr till Amazon i en fil, dÀr det för varje resurs som du beskrev finns motsvarande resurser som skapades i Amazon. NÀr man Àndrar beskrivningen av en resurs vet Terraform alltsÄ exakt vad som behöver Àndras i Amazon.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Dessa tillstÄndsfiler var ursprungligen bara filer. Och vi lagrade dem i Git, vilket var extremt obekvÀmt. StÀndigt glömde nÄgon att begÄ förÀndringar, och det var mÄnga konflikter.

Nu Àr det möjligt att anvÀnda backend, det vill sÀga Terraform anges i vilken hink, med vilken nyckel tillstÄndsfilen ska sparas. Och Terraform kommer sjÀlv att ta hand om den hÀr tillstÄndsfilen, göra all magin och lÀgga tillbaka det slutliga resultatet.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

VÄr infrastruktur vÀxer. HÀr Àr vÄr kod. Och nu vill vi inte bara skapa en virtuell maskin, vi vill ha en testmiljö.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Terraform lÄter dig göra en sÄdan sak som en modul, dvs beskriva samma sak i nÄgon mapp.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Och, till exempel, i testning, ring den hÀr modulen och fÄ samma sak som om vi skulle göra Terraform-applicering i sjÀlva modulen. HÀr Àr koden för att testa.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

För produktion kan vi skicka nÄgra Àndringar dit, för i tester behöver vi inte stora instanser, i produktion kommer stora instanser att komma till nytta.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Och sÄ ska jag gÄ tillbaka till projektet. Det var en svÄr uppgift, infrastrukturen var planerad mycket stor. Och det var nödvÀndigt att pÄ nÄgot sÀtt placera all kod sÄ att den skulle vara bekvÀm för alla: för dem som utför underhÄll pÄ den hÀr koden och för dem som gör Àndringar. Och det var planerat att vilken utvecklare som helst kunde gÄ och fixa infrastrukturen efter behov för hans del av plattformen.

Detta Àr ett katalogtrÀd som rekommenderas av HashiCorp om du har ett stort projekt och det Àr vettigt att dela upp hela infrastrukturen i nÄgra smÄ bitar, och beskriva varje del i en separat mapp.

Med ett omfattande resursbibliotek kan du ringa ungefÀr samma sak i testning och i produktion.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

I vÄrt fall var detta inte helt lÀmpligt, eftersom teststacken för utvecklare eller för testning behövde fÄs pÄ nÄgot sÀtt enklare. Och jag ville inte gÄ igenom mapparna och ansöka i rÀtt ordning och oroa mig för att basen skulle stiga, och dÄ skulle instansen som anvÀnder den hÀr basen stiga. DÀrför startade all testning frÄn en mapp. Samma moduler kallades dit, men allt gick igenom i en körning.

Terraform tar hand om alla beroenden. Och det skapar alltid resurser i den sekvensen sÄ att du kan fÄ en IP-adress, till exempel frÄn en nyskapad instans, och fÄ denna IP-adress i route53-posten.

Dessutom Àr plattformen vÀldigt stor. Och att köra en teststack, Àven om det Àr i en timme, Àven om det Àr i 8 timmar, Àr en ganska dyr affÀr.

Och vi har automatiserat den hÀr verksamheten. Och Jenkins-jobbet lÀt stacken springa. Det var nödvÀndigt att lansera en pull-begÀran i den med de Àndringar som utvecklaren vill testa, ange alla nödvÀndiga alternativ, komponenter och storlekar. Om han vill ha prestationstestning kan han ta fler instanser. Om han bara behöver kontrollera att nÄgon blankett öppnas kan han börja pÄ minimilönen. Och ange Àven om ett kluster behövs eller inte, etc.

Och sedan tryckte Jenkins ett skalskript som Àndrade koden nÄgot i Terraform-mappen. Tog bort onödiga filer, la till nödvÀndiga filer. Och sedan, med en körning av Terraform applicering, steg stapeln.

Och sÄ fanns det andra steg som jag inte vill gÄ in pÄ.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

PÄ grund av att vi för testning behövde lite fler alternativ Àn i produktionen, var vi tvungna att göra kopior av modulerna sÄ att vi i dessa kopior kunde lÀgga till de funktioner som bara behövs vid testning.

Och det hÀnde sÄ att i testning verkar det som att du vill testa de förÀndringar som sÄ smÄningom kommer att gÄ till produktion. Men i sjÀlva verket testades en sak, och lite annorlunda anvÀndes i produktionen. Och det blev ett litet brott i mönstret att i produktionen tillÀmpades alla förÀndringar av driftteamet. Och ibland visade det sig att de förÀndringarna som var tÀnkta att gÄ frÄn testning till produktion, de förblev i en annan version.

Dessutom var det ett sÄdant problem att en ny tjÀnst lades till, som skilde sig nÄgot frÄn nÄgon befintlig. Och istÀllet för att modifiera en befintlig modul, var du tvungen att göra en kopia av den och lÀgga till nödvÀndiga Àndringar.

Faktum Ă€r att Terraform inte Ă€r ett riktigt sprĂ„k. Detta Ă€r en förklaring. Om vi ​​behöver deklarera nĂ„got, dĂ„ deklarerar vi det. Och allt fungerar.

Vid nÄgot tillfÀlle, nÀr jag diskuterade en av mina pull-förfrÄgningar, sa en av mina kollegor att det inte Àr nödvÀndigt att producera snöflingor. Jag undrade vad han menade. Det finns ett sÄdant vetenskapligt faktum att det inte finns tvÄ identiska snöflingor i vÀrlden, de Àr alla nÄgot, men olika. Och sÄ fort jag hörde detta kÀnde jag omedelbart den fulla vikten av Terraform-koden. För nÀr det krÀvdes att gÄ frÄn version till version krÀvde Terraform ett brytande kedjebyte, d.v.s. koden var inte lÀngre kompatibel med nÀsta version. Och jag var tvungen att göra en pull-förfrÄgan, som tÀckte nÀstan hÀlften av filerna i infrastrukturen, för att fÄ infrastrukturen till nÀsta version av Terraform.

Och efter att en sÄdan snöflinga dök upp blev all Terraform-kod som vi hade förvandlat till en stor, stor snöhög.

För en extern utvecklare som Àr utanför drift spelar det ingen större roll för honom, eftersom han gjorde en pull-förfrÄgan, hans resurs startade. Och det Àr det, det Àr inte hans angelÀgenhet. Och DevOps-teamet som ser till att allt Àr OK mÄste göra alla dessa Àndringar. Och kostnaden för dessa förÀndringar ökade vÀldigt, vÀldigt mycket för varje ytterligare snöflinga.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det finns en berÀttelse om hur en student pÄ ett seminarium ritar tvÄ perfekta cirklar med krita pÄ en svart tavla. Och lÀraren Àr förvÄnad över hur han lyckades rita sÄ smidigt utan kompass. Eleven svarar: "Det Àr vÀldigt enkelt, jag gjorde en köttkvarn i tvÄ Är i armén."

Och av de fyra Är som jag har varit pÄ det hÀr projektet har jag gjort Terraform i ungefÀr tvÄ Är. Och sjÀlvklart har jag nÄgra knep, nÄgra tips pÄ hur man förenklar Terraform-koden, arbetar med den som ett programmeringssprÄk och minskar bördan för utvecklare som mÄste hÄlla den hÀr koden uppdaterad.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det första jag skulle vilja börja med Àr Symlinks. Terraform har mycket repetitiv kod. Till exempel Àr det samma sak att ringa en leverantör vid nÀstan varje punkt dÀr vi skapar en del av infrastrukturen. Och det Àr logiskt att lÀgga det i en separat pappa. Och varhelst leverantören krÀvs för att skapa symboliska lÀnkar till den hÀr filen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Till exempel anvÀnder du anta roll i produktionen, vilket gör att du kan fÄ ÄtkomstrÀttigheter till nÄgot externt Amazon-konto. Och genom att Àndra en fil kommer alla de ÄterstÄende som finns i resurstrÀdet att ha de nödvÀndiga rÀttigheterna sÄ att Terraform vet vilket Amazon-segment som ska komma Ät.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

DÀr symlÀnkar inte fungerar? Terraform har som sagt tillstÄndsfiler. Och de Àr vÀldigt, vÀldigt coola. Men faktum Àr att Terraform initierar backend i den allra första. Och han kan inte anvÀnda nÄgra variabler i dessa parametrar, de mÄste alltid skrivas i text.

Och som ett resultat, nÀr nÄgon skapar en ny resurs, kopierar han en del av koden frÄn andra mappar. Och han kan göra ett misstag med nyckeln eller med hinken. Till exempel gör han en sandlÄdesak av en sandlÄda och gör den sedan i produktion. Och sÄ kan det visa sig att hinken i produktion kommer att anvÀndas frÄn sandlÄdan. Naturligtvis hittar de det snabbt. Det kommer att gÄ att fixa detta pÄ nÄgot sÀtt, men det Àr ÀndÄ slöseri med tid och i viss mÄn resurser.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Vad kan vi göra hÀrnÀst? Innan du arbetar med Terraform mÄste du initiera den. Vid tidpunkten för initieringen laddar Terraform ner alla plugins. Vid nÄgot tillfÀlle bröt de frÄn en monolit till en mer mikrotjÀnstarkitektur. Och du behöver alltid göra Terraform init sÄ att den drar upp alla moduler, alla plugins.

Och du kan anvĂ€nda ett skalskript, som för det första kan fĂ„ alla variabler. Shell-skriptet Ă€r obegrĂ€nsat. Och, för det andra, vĂ€gen. Om vi ​​alltid anvĂ€nder sökvĂ€gen som finns i förvaret som nyckel till tillstĂ„ndsfilen, kommer dĂ€rför felet att uteslutas hĂ€r.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Var fÄr man tag i data? JSON-fil. Terraform lÄter dig skriva infrastruktur inte bara i hcl (HashiCorp Configuration Language), utan ocksÄ i JSON.

JSON Àr lÀtt att lÀsa frÄn ett skalskript. Följaktligen kan du lÀgga en konfigurationsfil med en hink pÄ nÄgon plats. Och anvÀnd denna hink bÄde i Terraform-koden och i skalskriptet för initiering.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Varför Àr det viktigt att ha en Terraform hink? För det finns nÄgot sÄdant som fjÀrrtillstÄndsfiler. Det vill sÀga, nÀr jag skaffar nÄgon resurs, för att sÀga till Amazon: "VÀnligen höj instans", mÄste jag ange mÄnga nödvÀndiga parametrar.

Och dessa identifierare lagras i nÄgon annan mapp. Och jag kan ta det och sÀga: "Terraform, snÀlla kör till tillstÄndsfilen för just den resursen och skaffa mig dessa identifierare." Och dÀrmed finns det ett slags enande mellan olika regioner eller miljöer.

Det Àr inte alltid möjligt att anvÀnda en fjÀrrtillstÄndsfil. Till exempel skapade du en VPC manuellt. Och Terraform-koden som skapar VPC:n skapar en sÄ annorlunda VPC att det tar vÀldigt lÄng tid och du mÄste anpassa den ena till den andra, sÄ du kan anvÀnda följande knep.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det vill sÀga att göra en modul som sÄ att sÀga gör VPC och ger dig identifierare, men i sjÀlva verket finns det bara en fil med hÄrdkodade vÀrden som kan anvÀndas för att skapa samma instans.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det Àr inte alltid nödvÀndigt att spara tillstÄndsfilen i molnet. Till exempel, nÀr du testar moduler, kan du anvÀnda backend-initiering, nÀr filen kommer att sparas bara pÄ disken vid testtillfÀllet.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Nu lite om att testa. Vad kan testas i Terraform? Förmodligen Àr mycket möjligt, men jag kommer att prata om dessa 4 saker.

HashiCorp har en förstÄelse för hur man formaterar Terraform-kod. Och Terraform fmt lÄter dig formatera koden du redigerar enligt den övertygelsen. Följaktligen mÄste testerna med nödvÀndighet kontrollera om formateringen stÀmmer överens med vad HashiCorp testamenterade, sÄ att du inte behöver Àndra placeringen av parenteser etc.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

NÀsta Àr Terraform validate. Det gör lite mer Àn en syntaxkontroll - ala, Àr alla parenteser parade. Vad Àr viktigt hÀr? Vi har en vÀldigt tunn infrastruktur. Den har mÄnga olika mappar. Och i varje mÄste du köra Terraform-validering.

För att pÄskynda testningen kör vi dÀrför flera processer parallellt med parallellt.

Parallell Àr en vÀldigt cool sak, anvÀnd den.

Men varje gÄng Terraform initieras gÄr det till HashiCorp och frÄgar: "Vilka Àr de senaste plugins? Och plugin som jag har i cachen - Àr det den eller inte den? Och det saktade ner för varje steg.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Om Terraform berÀttar var plugin-programmen finns, kommer Terraform att sÀga: "OK, det hÀr Àr förmodligen det fÀrskaste som finns. Jag gÄr ingenstans, jag börjar validera din Terraform-kod direkt."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

För att fylla mappen med nödvÀndiga plugins har vi en vÀldigt enkel Terraform-kod som bara behöver initieras. HÀr mÄste du naturligtvis ange alla leverantörer som pÄ nÄgot sÀtt deltar i din kod, annars kommer Terraform att sÀga: "Jag kÀnner inte till nÄgon leverantör, eftersom den inte finns i cachen."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

NÀsta Àr Terraform-planen. Utvecklingen Àr som sagt cyklisk. Vi gör kod med Àndringar. Och sedan mÄste du ta reda pÄ vilka förÀndringar som planeras för infrastrukturen.

Och nÀr infrastrukturen Àr vÀldigt, vÀldigt stor, kan du byta en modul, fixa nÄgon testmiljö eller nÄgon specifik region och bryta nÄgon intilliggande. DÀrför bör en Terraform-plan göras för hela infrastrukturen och visa vilka förÀndringar som planeras.

Du kan göra det pÄ ett smart sÀtt. Till exempel skrev vi ett Python-skript som löser beroenden. Och beroende pÄ vad som har Àndrats: en Terraform-modul eller bara en specifik komponent, gör den planer för alla beroende mappar.

Terraformplan ska göras pÄ begÀran. Det Àr Ätminstone vad vi gör.

Tester Àr naturligtvis bra att göra för varje förÀndring, för varje commit, men planer Àr ganska dyrt. Och vi sÀger i pull-förfrÄgan: "SnÀlla ge mig planerna." Roboten startar. Och skickar till kommentarer eller för att bifoga alla planer som förvÀntas av dina Àndringar.

Planen Ă€r en ganska dyr sak. Det tar tid eftersom Terraform gĂ„r till Amazon och frĂ„gar: "Finns den hĂ€r instansen fortfarande? Har denna autoskalning exakt samma parametrar?”. Och för att pĂ„skynda det kan du anvĂ€nda en parameter som refresh=false. Detta innebĂ€r att Terraform kommer att tömma S3-tillstĂ„ndet. Och kommer att tro att staten exakt kommer att matcha vad som finns i Amazon.

En sÄdan Terraform-plan Àr mycket snabbare, men staten mÄste matcha din infrastruktur, det vill sÀga nÄgonstans, nÄgon gÄng mÄste Terraform-uppdateringen börja. Terraform refresh gör precis det, sÄ att staten matchar det som finns i den verkliga infrastrukturen.

Och jag mÄste sÀga om sÀkerheten. Det var hÀr det borde ha börjat. DÀr du kör Terraform och Terraform arbetar med din infrastruktur finns det en sÄrbarhet. Det vill sÀga, du kör i princip kod. Och om pull-begÀran innehÄller nÄgon form av skadlig kod, kan den köras pÄ en infrastruktur som har för mycket Ätkomst. Var dÀrför försiktig med var du lanserar Terraform-planen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

NÀsta sak jag skulle vilja prata om Àr testning av anvÀndardata.

Vad Ă€r anvĂ€ndardata? I Amazon, nĂ€r vi skapar en instans kan vi skicka nĂ„got slags brev frĂ„n instansen – metadata. NĂ€r en instans startas Ă€r cloud init vanligtvis alltid nĂ€rvarande pĂ„ dessa instanser. Cloud init lĂ€ser detta brev och sĂ€ger: "OK, idag Ă€r jag en lastbalanserare." Och i enlighet med dessa föreskrifter utför han nĂ„gra handlingar.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Men tyvÀrr, nÀr vi anvÀnder Terraform-planen och Terraform tillÀmpar, ser anvÀndardata ut som den hÀr uppslamningen av siffror. Det vill sÀga, han skickar bara en hash till dig. Och allt du kan se i planen Àr om det kommer att ske nÄgra förÀndringar eller om hashen förblir densamma.

Och om du inte uppmÀrksammar detta, kan nÄgon slagen textfil gÄ till Amazon, till den verkliga infrastrukturen.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Alternativt kan du ange inte hela infrastrukturen under körningen, utan endast mallen. Och sÀg i koden: "Visa den hÀr mallen Ät mig." Och som ett resultat kan du fÄ en utskrift av hur din data kommer att se ut pÄ Amazon.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Ett annat alternativ Àr att anvÀnda en modul för att generera anvÀndardata. Du kommer att tillÀmpa denna modul. HÀmta filen pÄ disken. JÀmför det med referensen. Och dÀrför, om nÄgon jun bestÀmmer sig för att fixa lite anvÀndardata, kommer dina tester att sÀga: "OK, det finns nÄgra Àndringar hÀr och dÀr - det hÀr Àr normalt."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

NÀsta sak jag skulle vilja prata om Àr Automate Terraform application.

Naturligtvis Àr det skrÀmmande nog att anvÀnda Terraform i automatiskt lÀge, för vem vet vilka förÀndringar som har kommit dÀr och hur skadliga de kan vara för en levande infrastruktur.

För en testmiljö Àr allt bra. Det vill sÀga ett jobb som skapar en testmiljö Àr vad alla utvecklare behöver. Och ett sÄdant uttryck som "allt fungerade för mig" Àr inte ett roligt meme, utan ett bevis pÄ att en person blev förvirrad, höjde en stack, startade nÄgra tester pÄ denna stack. Och han sÄg till att allt var bra dÀr och sa: "OK, koden som jag slÀpper har testats."

I produktion, sandlÄda och andra miljöer som Àr mer affÀrskritiska Àr det sÀkert att delvis anvÀnda vissa resurser eftersom det inte fÄr nÄgon att dö. Dessa Àr: autoskala grupper, sÀkerhetsgrupper, roller, route53 och dÀr kan listan vara ganska stor. Men hÄll ett öga pÄ vad som hÀnder, lÀs rapporter om automatiserade applikationer.

DÀr det Àr farligt eller lÀskigt att anvÀnda, till exempel om det Àr nÄgra bestÀndiga resurser, frÄn en databas, fÄ dÄ rapporter om att det finns otillÀmpade Àndringar i nÄgon del av infrastrukturen. Och ingenjören Àr redan övervakad att köra jobb för att ansöka eller göra det frÄn sin konsol.

Amazon har en sÄdan sak som Terminate-skydd. Och det kan i vissa fall skydda mot Àndringar som inte krÀvs för dig. SÄ Terraform gick till Amazon och sa "Jag mÄste döda den hÀr instansen för att göra en till". Och Amazon sÀger: "TyvÀrr, inte idag. Vi har Terminate-skydd."

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Och grÀdden pÄ moset Àr kodoptimering. NÀr vi arbetar med Terraform-kod mÄste vi skicka ett mycket stort antal parametrar till modulen. Det Àr de parametrar som Àr nödvÀndiga för att skapa nÄgon form av resurs. Och koden förvandlas till stora listor med parametrar som mÄste skickas frÄn modul till modul, frÄn modul till modul, speciellt om modulerna Àr kapslade.

Och det Àr vÀldigt svÄrt att lÀsa. Det Àr vÀldigt svÄrt att granska detta. Och vÀldigt ofta visar det sig att vissa parametrar ses över och det Àr inte riktigt de som behövs. Och det kostar tid och pengar att fixa det senare.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

DÀrför föreslÄr jag att du anvÀnder en sÄdan sak som en komplex parameter som inkluderar ett visst vÀrdetrÀd. Det vill sÀga, du behöver nÄgon form av mapp dÀr du har alla vÀrden som du skulle vilja ha pÄ nÄgon form av miljö.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Och genom att anropa denna modul kan du fÄ ett trÀd som genereras i en gemensam modul, det vill sÀga i en gemensam modul som fungerar likadant för hela infrastrukturen.

I den hÀr modulen kan du göra nÄgra berÀkningar med hjÀlp av en sÄ frÀsch funktion i Terraform som lokalbefolkningen. Och sedan i en utgÄng, utfÀrda nÄgon form av komplex parameter, som kan inkludera hash, arrayer, etc.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

PĂ„ detta, alla de bĂ€sta fynden som jag har avslutat. Och jag skulle vilja berĂ€tta en historia om Columbus. NĂ€r han letade efter pengar för sin expedition för att upptĂ€cka Indien (som han trodde dĂ„) var det ingen som trodde pĂ„ honom och trodde att det var omöjligt. DĂ„ sa han: "Se till att Ă€gget inte faller." Alla bankirer, mycket rika och förmodligen smarta mĂ€nniskor, försökte lĂ€gga Ă€gget pĂ„ nĂ„got sĂ€tt, och det föll hela tiden. Sedan tog Columbus Ă€gget, tryckte lite pĂ„ det. Skalet skrynklades och Ă€gget förblev orörligt. De sa: "Åh, det Ă€r för lĂ€tt!" Och Columbus svarade: "Ja, det Ă€r för enkelt. Och nĂ€r jag öppnar Indien kommer alla att anvĂ€nda den hĂ€r handelsvĂ€gen.”

Och det jag just har berÀttat för er Àr förmodligen ganska enkla och triviala saker. Och nÀr du fÄr reda pÄ dem och börjar anvÀnda dem Àr det i sin ordning. SÄ anvÀnd den. Och om det hÀr Àr ganska normala saker för dig, sÄ vet du Ätminstone hur man lÀgger ett Àgg sÄ att det inte faller.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

LĂ„t oss sammanfatta:

  • Försök att undvika snöflingor. Och ju fĂ€rre snöflingor, desto fĂ€rre resurser behöver du för att göra Ă€ndringar i hela din stora infrastruktur.
  • StĂ€ndig förĂ€ndring. Det vill sĂ€ga, nĂ€r vissa Ă€ndringar har skett i koden mĂ„ste du bringa din infrastruktur i linje med dessa Ă€ndringar sĂ„ snart som möjligt. Det borde inte finnas en situation nĂ€r nĂ„gon kommer om tvĂ„ eller tre mĂ„nader för att titta pĂ„ Elasticsearch, gör en Terraform-plan och det finns mĂ„nga förĂ€ndringar som han inte förvĂ€ntade sig. Och det tar mycket tid att fĂ„ allt i ordning igen.
  • Tester och automatisering. Ju mer din kod Ă€r tĂ€ckt med tester och marker, desto mer förtroende har du för att du gör allt rĂ€tt. Och automatisk leverans kommer att öka ditt sjĂ€lvförtroende mĂ„nga gĂ„nger om.
  • Koden för test- och produktionsmiljön bör vara nĂ€stan densamma. Rent praktiskt, för trots allt Ă€r produktionen lite annorlunda och det kommer fortfarande att finnas en del nyanser som kommer att gĂ„ bortom testmiljön. Men Ă€ndĂ„, plus eller minus det kan tillhandahĂ„llas.
  • Och om du har mycket Terraform-kod och det tar mycket tid att hĂ„lla den hĂ€r koden uppdaterad, dĂ„ Ă€r det aldrig för sent att omstrukturera och fĂ„ den i god form.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

  • oförĂ€nderlig infrastruktur. AMI leverans enligt schema.
  • Struktur för route53 nĂ€r du har mĂ„nga poster och vill att de ska vara i en konsekvent ordning.
  • KĂ€mpa mot API-hastighetsgrĂ€nser. Det Ă€r nĂ€r Amazon sĂ€ger, "Det Ă€r allt, jag kan inte acceptera nĂ„gra fler förfrĂ„gningar, vĂ€nligen vĂ€nta." Och hĂ€lften av kontoret vĂ€ntar tills det kan lansera sin infrastruktur.
  • upptĂ€cka instanser. Amazon Ă€r inget billigt evenemang och platser gör att du kan spara en hel del. Och dĂ€r kan du berĂ€tta en hel rapport om det.
  • SĂ€kerhets- och IAM-roller.
  • Sök efter förlorade resurser, nĂ€r du har instanser av okĂ€nt ursprung i Amazone Ă€ter de pengar. Även om instanser kostar 100-150 USD per mĂ„nad Ă€r det mer Ă€n 1 000 USD per Ă„r. Att hitta sĂ„dana resurser Ă€r en lukrativ affĂ€r.
  • Och reserverade instanser.

Mönster i Terraform för att bekÀmpa kaos och manuell rutin. Maxim Kostrikin (Ixtens)

Det var allt för mig. Terraform Àr vÀldigt cool, anvÀnd den. Tack!

frÄgor

Tack för rapporten! Du har en tillstÄndsfil i S3, men hur löser du problemet med att flera personer kan ta den hÀr tillstÄndsfilen och försöka distribuera?

För det första har vi inte brÄttom. För det andra finns det flaggor, dÀr vi rapporterar att vi arbetar med nÄgon kod. Det vill sÀga, trots att infrastrukturen Àr vÀldigt stor betyder det inte att nÄgon stÀndigt anvÀnder nÄgot. Och nÀr det var en aktiv fas var detta ett problem, vi behöll tillstÄndsfiler i Git. Detta var viktigt, annars skulle nÄgon göra en tillstÄndsfil, och vi var tvungna att manuellt samla dem i en hög för att kunna fortsÀtta vidare. Nu finns det inget sÄdant problem. I allmÀnhet löste Terraform detta problem. Och om nÄgot stÀndigt förÀndras, dÄ kan du anvÀnda lÄs som förhindrar det du sagt.

AnvÀnder du öppen kÀllkod eller företag?

Inget företag, det vill sÀga allt du kan gÄ och ladda ner gratis.

Jag heter Stanislav. Jag ville göra ett litet tillÀgg. Du pratade om Amazon-funktionen som lÄter dig göra en instans oavdödlig. Detta Àr ocksÄ i sjÀlva Terraform, i Life Second-blocket kan du föreskriva ett förbud mot förÀndring, eller ett förbud mot förstörelse.

Var tidsbegrÀnsad. Bra poÀng.

Jag ville ocksÄ frÄga tvÄ saker. Först pratade du om att testa. Har du anvÀnt nÄgra testverktyg? Jag hörde talas om testkökets plugin. Kanske finns det nÄgot annat. Och jag skulle vilja frÄga om lokala vÀrderingar. Hur skiljer de sig i princip frÄn indatavariabler? Och varför kan jag inte parametrisera nÄgot bara genom lokala vÀrderingar? Jag försökte ta itu med det hÀr Àmnet, men pÄ nÄgot sÀtt kom jag inte pÄ det sjÀlv.

Vi kan prata mer i detalj bakom den hÀr hallen. Testverktyg Àr vÄr kompletta egentillverkade. Det finns inget att testa dÀr. Generellt finns det alternativ nÀr automatiska tester höjer infrastrukturen nÄgonstans, kontrollera att den Àr OK och sedan förstöra allt med en rapport om att din infrastruktur fortfarande Àr i bra skick. Det har vi inte eftersom teststackarna gÄr varje dag. Och det rÀcker. Och om nÄgot börjar gÄ sönder sÄ börjar det gÄ sönder utan att vi kollar det nÄgon annanstans.

NÀr det gÀller lokala vÀrderingar, lÄt oss fortsÀtta samtalet utanför publiken.

HallÄ! Tack för rapporten! Mycket informativt. Du sa att du har mycket av samma typ av kod för att beskriva infrastrukturen. Har du funderat pÄ att generera den hÀr koden?

Bra frÄga, tack! PoÀngen Àr att nÀr vi anvÀnder infrastruktur som kod, antar vi att vi tittar pÄ koden och förstÄr vilken typ av infrastruktur som ligger bakom denna kod. Om koden genereras mÄste vi förestÀlla oss vilken kod som kommer att genereras för att förstÄ vilken typ av infrastruktur som kommer att finnas dÀr. Eller sÄ genererar vi koden, begÄr den och i sjÀlva verket fÄr vi samma sak. DÀrför gick vi som vi skrev, vi fick det. Dessutom dök det upp generatorer lite senare, nÀr vi började tillverka. Och det var för sent att byta.

Har du hört talas om jsonnet?

Nej.

Titta, det hÀr Àr riktigt coola grejer. Jag ser ett specifikt fall dÀr du kan tillÀmpa det och generera en datastruktur.

Generatorer Àr bra nÀr man har dem, som i skÀmtet om rakmaskinen. Det vill sÀga första gÄngen Àr ansiktet annorlunda, men dÄ har alla samma ansikte. Generatorerna Àr vÀldigt coola. Men tyvÀrr Àr vÄra ansikten lite annorlunda. Det Àr problem.

Bara kolla. Tack!

Jag heter Maxim, jag kommer frĂ„n Sberbank. Du sa lite att du försökte föra Terraform till en analog av ett programmeringssprĂ„k. Är det inte lĂ€ttare att anvĂ€nda Ansible?

Det hÀr Àr vÀldigt olika saker. Ansible kan skapa resurser och Puppet kan skapa resurser i Amazon. Men Terraform Àr rent ut sagt skÀrpt.

Har du bara Amazon?

Det Àr inte sÄ att vi bara har Amazon. Vi har nÀstan bara Amazon. Men nyckelfunktionen Àr att Terraform minns. I Ansible, om du sÀger: "HÀmta mig 5 instanser", kommer det att höjas, och sedan sÀger du: "Och nu behöver jag 3". Och Terraform kommer att sÀga: "Ok, jag dödar 2", och Ansible kommer att sÀga: "Ok, hÀr Àr 3 för dig." Totalt 8.

HallÄ! Tack för din rapport! Det var vÀldigt intressant att höra om Terraform. Jag vill bara göra en liten kommentar om att Terraform fortfarande inte har en stabil release, sÄ var vÀldigt försiktig med Terraform.

Fin sked till middag. Dvs behöver man en lösning sÄ skjuter man ibland upp det som Àr instabilt osv, men det fungerar och hjÀlpte oss.

FrÄgan Àr. Du anvÀnder fjÀrrbackend, du anvÀnder S 3. Varför anvÀnder du inte den officiella backend?

Officiell?

Terraform moln.

NÀr dök han upp?

4 mÄnader sedan.

Om det hade dykt upp för 4 Är sedan skulle jag förmodligen ha svarat pÄ din frÄga.

Det finns redan en inbyggd funktion och lÄs, och du kan lagra en tillstÄndsfil. Försök. Men jag har inte testat heller.

Vi sitter pÄ ett stort tÄg som rör sig i hög hastighet. Och du kan inte bara ta och kasta ut nÄgra bilar.

Du pratade om snöflingor, varför anvÀnde du inte gren? Varför gick det inte sÄ?

Vi har ett sÄdant synsÀtt att hela infrastrukturen finns i ett förvar. Terraform, Puppet, alla skript som pÄ nÄgot sÀtt relaterar till detta, de finns alla i ett arkiv. PÄ sÄ sÀtt kan vi sÀkerstÀlla att inkrementella Àndringar testas en efter en. Om det vore ett gÀng grenar skulle ett sÄdant projekt vara nÀstan omöjligt att underhÄlla. Sex mÄnader gÄr och de skiljer sig sÄ mycket att det bara Àr nÄgon form av straff. Det hÀr var vad jag ville fly ifrÄn innan omfaktorn.

dvs det fungerar inte?

Det fungerar inte alls.

I gren klippte jag ut mappbilden. Det vill sÀga, om du gör för varje teststack, till exempel, lag A har sin egen pappa, lag B har sin egen pappa, dÄ fungerar inte detta heller. Vi gjorde en enhetlig testmiljökod som var tillrÀckligt flexibel för att passa alla. Det vill sÀga vi serverade en kod.

HallÄ! Jag heter Yura! Tack för rapporten! FrÄga om moduler. Du sÀger att du anvÀnder moduler. Hur löser du problemet om Àndringar gjordes i en modul som inte Àr kompatibla med bytet av en annan person? PÄ nÄgot sÀtt versionera moduler eller försöka fÄ ett underbarn att uppfylla tvÄ krav?

Detta Àr det stora problemet med snöhögen. Det Àr detta vi lider av nÀr nÄgon ofarlig förÀndring kan bryta nÄgon del av infrastrukturen. Och det kommer att mÀrkas först efter en lÄng tid.

Dvs det Àr inte bestÀmt Àn?

Du gör universella moduler. Undvik snöflingor. Och allt kommer att ordna sig. Den andra halvan av rapporten handlar om hur man undviker det.

HallÄ! Tack för rapporten! Jag skulle vilja förtydliga. Bakom kulisserna fanns en stor hög, som jag kom för. Hur Àr Puppet och rollfördelning integrerade?

anvÀndardata.

Det vill sÀga, spottar du bara ut filen och kör pÄ den pÄ nÄgot sÀtt?

AnvÀndardata Àr en anteckning, det vill sÀga nÀr vi gör en bildklon, dÄ reser sig Daemon dÀr och försöker ta reda pÄ vem han Àr, lÀser en anteckning om att han Àr en lastbalanserare.

Det vill sÀga Àr det nÄgon form av separat process som ges bort?

Vi uppfann det inte. Vi anvÀnder det.

HallÄ! Jag har bara en frÄga om User - data. Du sa att det finns problem dÀr, att nÄgon kan skicka nÄgot till fel stÀlle. Finns det nÄgot sÀtt att lagra anvÀndardata i samma Git, sÄ att det alltid Àr tydligt vad User-data syftar pÄ?

Vi genererar anvĂ€ndardata frĂ„n mall. Det vill sĂ€ga att ett visst antal variabler tar till dĂ€r. Och Terraform genererar slutresultatet. DĂ€rför kan du inte bara titta pĂ„ mallen och sĂ€ga vad som hĂ€nder, eftersom alla problem Ă€r relaterade till det faktum att utvecklaren tror att han passerar en rad i denna variabel, och sedan anvĂ€nds en array. Och han – pang och jag – sĂ„ och sĂ„, sĂ„ och sĂ„, nĂ€sta rad, och allt gick sönder. Om det hĂ€r Ă€r en ny resurs och en person tar upp den, ser att nĂ„got inte fungerar, sĂ„ löses detta snabbt. Och om den hĂ€r autoskalningsgruppen har uppdaterats, börjar instanserna i autoskalningsgruppen nĂ„gon gĂ„ng att ersĂ€ttas. Och klapp, nĂ„got fungerar inte. Det gör ont.

Det visar sig att den enda lösningen Àr att testa?

Ja, du ser problemet, du lÀgger till teststeg dÀr. Det vill sÀga, output'om kan ocksÄ testas. Kanske inte sÄ bekvÀmt, men du kan ocksÄ sÀtta nÄgra mÀrken - kontrollera att User-data Àr spikad hÀr.

Jag heter Timur. Det Àr vÀldigt hÀftigt att det finns rapporter om hur man organiserar Terraform pÄ rÀtt sÀtt.

Jag började inte ens.

Jag tror att det kanske blir det i nÀsta konferens. Jag har en enkel frÄga. Varför hÄrdkodar du vÀrdet i en separat modul istÀllet för att anvÀnda tfvars, d.v.s. Àr en modul med vÀrden bÀttre Àn tfvars?

Det vill sÀga, jag borde skriva hÀr (bild: Produktion/miljö/instÀllningar.tf): domÀn = variabel, domÀn vpcnetwork, vpcnetwork variabel och stvars - fÄr du samma sak?

Vi gör precis det. Vi hÀnvisar till exempel till instÀllningskÀllmodulen.

I sjÀlva verket Àr detta en sÄdan tfvars. Tfvars Àr vÀldigt praktiskt i en testmiljö. Jag har tfvar för stora instanser, för smÄ. Och jag slÀngde en fil i mappen. Och fick som jag ville. NÀr vi sÄg infrastruktur vill vi kunna se och omedelbart förstÄ allt. Och sÄ visar det sig att du mÄste titta hÀr, sedan titta i tfvars.

Det visar sig att allt var pÄ ett stÀlle?

Ja, tfvars Àr nÀr du har en kod. Och den anvÀnds pÄ flera olika stÀllen med olika nyanser. DÄ skulle du kasta tfvars och fÄ dina nyanser. Och vi Àr infrastruktur som kod i sin renaste form. Tittade och förstod.

HallÄ! Har du stött pÄ situationer dÀr molnleverantören stör det du har gjort med Terraform? LÄt oss sÀga att vi redigerar metadata. Det finns ssh-nycklar. Och Google skjuter stÀndigt in sin metadata, sina nycklar dÀr. Och Terraform skriver alltid att det har förÀndringar. Efter varje körning, Àven om ingenting förÀndras, sÀger han alltid att han kommer att uppdatera det hÀr fÀltet nu.

Med nycklar, men – ja, en del av infrastrukturen pĂ„verkas av nĂ„got sĂ„dant, d.v.s. Terraform kan inte Ă€ndra nĂ„gonting. Vi kan inte Ă€ndra nĂ„got med hĂ€nderna heller. SĂ„ lĂ€nge vi lever med det.

Det vill sÀga, du stötte pÄ det hÀr, men kom inte pÄ nÄgonting, hur gör han det och gör det sjÀlv?

TyvÀrr, ja.

HallÄ! Jag heter Stanislav Starkov. Post. sv Grupp. Hur löser man problemet med att generera en tagg pÄ ..., hur skickar man in den? Som jag förstÄr det, genom AnvÀndare - data, för att ange vÀrdnamnet, hetsa Puppet? Och den andra delen av frÄgan. Hur löser man det hÀr problemet i SG, d.v.s. nÀr man genererar SG, hundra instanser av samma typ, hur namnger man dem korrekt?

De fall som Àr mycket viktiga för oss kommer vi att namnge dem vackert. De som inte behövs, det finns en postscript att detta Àr en autoscale-grupp. Och i teorin kan den spikas, och fÄ en ny.

NÀr det gÀller problemet med taggen finns det inget sÄdant problem, men det finns en sÄdan uppgift. Och vi anvÀnder taggar vÀldigt, vÀldigt mycket, eftersom infrastrukturen Àr stor och dyr. Och vi mÄste titta pÄ vad pengar spenderas pÄ, sÄ taggar lÄter oss reda ut vad och vart det tog vÀgen. Och följaktligen Àr sökandet efter nÄgot hÀr mycket pengar som spenderas.

Vad handlade frÄgan om?

NÀr SG skapar hundra instanser, behöver de sÀrskiljas pÄ nÄgot sÀtt?

Nej, gör inte det. Varje instans har en agent som sÀger till mig att jag har ett problem. Om agenten rapporterar, dÄ vet agenten om honom och Ätminstone hans IP-adress existerar. Du kan redan springa. För det andra anvÀnder vi Consul for Discovery, dÀr det inte finns nÄgon Kubernetes. Och Consul visar ocksÄ instansens IP-adress.

Det vill sÀga, du riktar in dig pÄ exakt IP:n och inte vÀrdnamnet?

Det Àr omöjligt att navigera efter vÀrdnamn, det vill sÀga det finns mÄnga av dem. Det finns instansidentifierare - AE, etc. Du kan hitta den nÄgonstans, du kan slÀnga in den i sökningen.

HallÄ! Jag insÄg att Terraform Àr en bra sak, skrÀddarsydd för molnen.

Inte bara.

Det Àr frÄgan som intresserar mig. Om du bestÀmmer dig för att flytta, sÀg, till Bare Metal en masse med alla dina instanser? Kommer det bli nÄgra problem? Eller mÄste du fortfarande anvÀnda andra produkter, till exempel samma Ansible som nÀmndes hÀr?

Ansible handlar lite om nÄgot annat. Det vill sÀga, Ansible körs redan nÀr instansen har startat. Och Terraform fungerar innan instansen har startat. Att byta till Bare Metal Àr det inte.

Inte nu, men affÀrer kommer och sÀger: "Kom igen."

Att byta till ett annat moln – ja, men det finns en lite annan funktion hĂ€r. Du mĂ„ste skriva Terraform-kod pĂ„ ett sĂ„dant sĂ€tt att du kan byta till nĂ„got annat moln med mindre blodsutgjutelse.

Inledningsvis var uppgiften att hela vĂ„r infrastruktur Ă€r agnostisk, d.v.s. alla moln ska vara bra, men nĂ„gon gĂ„ng gav verksamheten upp och sa: ”OK, under de kommande N Ă„ren kommer vi ingenstans, du kan anvĂ€nda tjĂ€nster frĂ„n Amazon".

Terraform lÄter dig skapa Front-End-jobb, konfigurera PagerDuty, datadokument etc. Det har mÄnga svansar. Han kan praktiskt taget kontrollera hela vÀrlden.

Tack för rapporten! Jag har ocksÄ snurrat Terraform i 4 Är nu. I skedet av en smidig övergÄng till Terraform, till infrastruktur, till en deklarativ beskrivning, stod vi inför en situation dÀr nÄgon gjorde nÄgot för hand och du försökte göra en plan. Och jag fick ett fel dÀr. Hur hanterar du sÄdana problem? Hur hittar du de förlorade resurserna som angavs?

Mestadels med hÀnder och ögon, om vi ser nÄgot konstigt i rapporten, dÄ analyserar vi vad som hÀnder dÀr, eller sÄ dödar vi det. I allmÀnhet Àr pull-förfrÄgningar en vanlig sak.

Om det finns ett fel, ÄterstÀller du? Har du testat att göra detta?

Nej, detta Àr ett beslut av en person i det ögonblick dÄ han ser problemet.

KĂ€lla: will.com