Hej, Habr! Tidigare klagade jag pÄ livet i paradigmet Infrastructure as code och föreslog inget för att lösa situationen. Idag Àr jag tillbaka för att berÀtta om de metoder och praxis som kan hjÀlpa oss att bryta oss ur avgrunden av förtvivlan och leda situationen i rÀtt riktning.

I den föregÄende artikeln delade jag mina intryck av detta omrÄde, försökte reflektera över den aktuella situationen och till och med föreslog att standardpraxis som alla utvecklare kÀnner till kan hjÀlpa. Det kan ha verkat som att det fanns mycket klagande pÄ livet, men inga förslag för att ta sig ur den situationen.
Vem Àr vi, var Àr vi och vilka problem har vi
Just nu befinner vi oss i SRE Onboarding Team, som bestÄr av sex programmerare och tre infrastrukturingenjörer. Vi försöker alla skriva Infrastructure as code (IaC). Vi gör det eftersom vi generellt kan skriva kod och alla har erfarenhet som utvecklare pÄ "över medelnivÄ".
- Vi har en uppsÀttning fördelar: en viss bakgrund, kunskaper om praxis, förmÄga att skriva kod och en vilja att lÀra oss nya saker.
- Och det finns en svag punkt, det vill sÀga en nackdel: bristande kunskaper om den tekniska grunden för infrastrukturen.
Teknologiska stackar som vi anvÀnder i vÄr IaC.
- Terraform för att skapa resurser.
- Packer för att bygga bilder. Detta inkluderar Windows och CentOS 7-bilder.
- Jsonnet, för att göra kraftfulla byggen i drone.io, samt för att generera packer json och vÄra Terraform-moduler.
- Azure.
- Ansible vid skapande av bilder.
- Python för hjÀlptjÀnster samt provisioning-skript.
- Och allt detta i VSCode med tillÀgg som delas mellan teammedlemmarna.
Slutsatsen av min var sÄdan: jag försökte inge (frÀmst mig sjÀlv) optimisme, ville sÀga att vi kommer att prova de metoder och praxis som vi kÀnner till för att kÀmpa mot svÄrigheterna och utmaningarna i detta omrÄde.
Just nu kÀmpar vi med följande problem i IaC:
- Imperfektion i verktyg, utvecklingsmedel.
- LÄngsam distribueringsprocess. Infrastruktur Àr en del av den verkliga vÀrlden, vilket kan ta tid.
- Brist pÄ metoder och praxis.
- Vi Àr nya och vet inte mycket.
Extremprogrammering (XP) kommer till undsÀttning
Alla utvecklare kÀnner vÀl till extrem programmering (XP) och de metoder som ligger bakom. MÄnga av oss har arbetat enligt denna metodik och den har varit framgÄngsrik. SÄ varför inte anvÀnda principerna och metoderna som finns dÀr för att övervinna infrastruktursutmaningar? Vi har beslutat att tillÀmpa detta tillvÀgagÄngssÀtt och se vad som hÀnder.
Bedömning av tillÀmpbarheten av XP-metoden i er branschHÀr Àr en beskrivning av den miljö dÀr XP passar bra, och hur det relaterar till oss:
1. Dynamiskt förÀnderliga mjukvarukrav. Vi visste vad det slutgiltiga mÄlet var. Men detaljerna kan variera. Vi bestÀmmer sjÀlva hur vi ska navigera, sÄ kraven förÀndras periodiskt (frÀmst av oss sjÀlva). NÀr det gÀller SRE-teamet som sjÀlva gör automatiseringen och ocksÄ begrÀnsar krav och arbetsomfattning, sÄ passa det hÀr punkt bra.
2. Risker orsakade av fasta tidsprojekt som anvÀnder ny teknologi. Vi kan möta risker nÀr vi anvÀnder saker vi inte Àr bekanta med. Och det hÀr Àr 100 % vÄrt fall. Hela vÄrt projekt handlar om att anvÀnda teknologier som vi inte var helt bekanta med. Det Àr generellt ett konstant problem, eftersom mÄnga nya teknologier stÀndigt dyker upp inom infrastruktur.
3,4. Litet, samlokaliserat utvecklingsteam. Den teknik ni anvÀnder möjliggör automatiserade enhets- och funktionstest. Dessa tvÄ punkter passar oss inte riktigt. För det första Àr vi inte ett samlokaliserat team, för det andra Àr vi nio personer, vilket kan betraktas som ett stort team. Men enligt vissa definitioner av 'stort' team sÄ Àr mÄnga 14+ personer.
LÄt oss titta pÄ nÄgra metoder frÄn XP och hur de pÄverkar hastigheten och kvaliteten pÄ feedback.
Principen om feedbackcykeln i XP
I min förstÄelse Àr feedback svaret pÄ frÄgan, gör jag rÀtt, Àr vi pÄ vÀg Ät rÀtt hÄll? I XP finns en fantastisk schema: tidscykeln för feedback. Det intressanta Àr att ju lÀngre ner vi Àr i cykeln, desto snabbare fÄr vi tillbaka en respons för att kunna svara pÄ nödvÀndiga frÄgor.

Detta Àr ett ganska intressant Àmne för diskussion, att vi inom IT-branschen snabbt kan fÄ feedback. TÀnk dig hur svÄrt det skulle vara att genomföra ett projekt i ett halvÄr och först dÄ fÄ reda pÄ att det i början fanns ett fel. SÄdant sker bÄde inom design och i alla konstruktioner av komplexa system.
I det hÀr fallet hjÀlper IaC oss med feedback. Jag gör en liten justering i schemat ovan: vÄr releaseplan har inte en mÄnads cykel, utan sker flera gÄnger per dag. Till denna cykel Àr vissa praktiker kopplade som vi kommer att titta nÀrmare pÄ.
Viktigt: feedback kan bli lösningen pÄ alla ovan nÀmnda problem. Tillsammans med XP-praktiker kan den dra oss ur avgrunden av förtvivlan.
Hur man drar sig ur avgrunden av förtvivlan: tre praktiker
Tester
Tester nÀmns tvÄ gÄnger i XP:s feedbackcykel. Det Àr inte utan anledning. De Àr extremt viktiga för hela tekniken kring extrem programmering.
Det förutsÀtts att du har enhetstester och acceptanstester. Vissa ger dig feedback pÄ nÄgra minuter, andra tar dagar att skriva och körs mindre ofta.
Det finns en klassisk testpyramid som visar att vissa tester bör vara fler.

Hur Àr denna skema tillÀmplig pÄ vÄrt IaC-projekt? Egentligen⊠inte alls.
- Enhetstester, trots att det bör vara mÄnga av dem, kan inte vara för mÄnga. Antingen testar de nÄgot mycket indirekt. Faktiskt kan man sÀga att vi knappt skriver dem alls. Men hÀr Àr nÄgra tillÀmpningar för sÄdana tester som vi faktiskt lyckats genomföra:
- Testning av koden pÄ jsonnet. Detta Àr till exempel vÄr byggpipeline i drone, som Àr ganska komplex. Koden pÄ jsonnet Àr vÀl tÀckt av tester.
Vi anvÀnder detta . - Tester pÄ skript som körs nÀr resursen startas. Skript i Python, och dÀrmed kan tester skrivas för dem.
- Testning av koden pÄ jsonnet. Detta Àr till exempel vÄr byggpipeline i drone, som Àr ganska komplex. Koden pÄ jsonnet Àr vÀl tÀckt av tester.
- Det Àr potentiellt möjligt att kontrollera konfigurationen i tester, men vi gör inte sÄ. Det finns ocksÄ möjlighet att stÀlla in kontroller av konfigureringsregler för resurser via . Men för terraform Àr kontrollerna för grundlÀggande, och mÄnga testscenarier har skrivits för AWS. Vi har Azure, sÄ det hÀr passar inte heller.
- Komponentintegreringstester: hÀr beror det pÄ hur du klassificerar dem och var du placerar dem. Men de fungerar i grunden.
SÄ hÀr ser integreringstester ut.

Detta Àr ett exempel pÄ att bygga bilder i Drone CI. För att nÄ dem mÄste man vÀnta 30 minuter pÄ att Packer-bilden ska byggas, och sedan ytterligare 15 minuter pÄ att de ska genomföras. Men de finns!Algoritm för att kontrollera bilder
- Först mÄste Packer förbereda bilden helt.
- Bredvid testet finns det en Terraform med lokal status som vi anvÀnder för att distribuera bilden.
- Vid distributionen anvÀnds en liten modulfiler som ligger bredvid för att underlÀtta arbetet med bilden.
- NÀr en VM har distribuerats frÄn bilden kan kontroller pÄbörjas. Kontrollerna utförs huvudsakligen pÄ maskinen. Det kontrolleras hur skripten har fungerat vid start, hur daemons fungerar. För detta loggar vi in pÄ den nyss startade maskinen via ssh eller winrm och kontrollerar konfigurationsstatus eller om tjÀnsterna har startat.
- En liknande situation gÀller för integrationstester och moduler för Terraform. HÀr Àr en kort tabell som förklarar egenskaperna hos sÄdana tester.

à terkopplingen i pipelinen Àr ungefÀr 40 minuter. Allt tar vÀldigt lÄng tid. Det kan anvÀndas för regressionstester, men för ny utveckling Àr det verkligen omöjligt. Om man förbereder sig mycket, preparerar körande instÀllningar och skript kan tiden kortas ner till 10 minuter. Men det Àr fortfarande inte enhetstester, som kan göras 100 stycken pÄ 5 sekunder.
FrÄnvaron av enhetstester vid byggande av bilder eller moduler för Terraform gör att vi tvingas överlÀmna arbetet till separata tjÀnster, som enkelt kan anropas via REST, eller till Python-skript.
Till exempel behövde vi se till att den virtuella maskinen registrerade sig sjÀlv i tjÀnsten , och vid borttagning av VM:en raderade sig sjÀlv.
Eftersom ScaleFT Àr en tjÀnst mÄste vi arbeta med den via API. En wrapper har skrivits som vi kan anropa och sÀga: "GÄ in och ta bort det hÀr och det dÀr". Den lagrar alla nödvÀndiga instÀllningar och Ätkomster.
Till detta kan vi nu skriva normala tester, eftersom det inte skiljer sig frÄn vanlig mjukvara: nÄgon API mockas, du anropar, och vi ser vad som hÀnder.

Sammanfattning av testerna: Enhetstestning, som borde ta en minut enligt OS, ger ingen sÄdan feedback. Högre typer av tester ger effekt, men löser bara en del av problemen.
Parprogrammering
Tester Àr sjÀlvklart bra. Man kan skriva mÄnga av dem, och de kan vara av olika slag. De kommer att fungera pÄ sina nivÄer och ge oss feedback. Men problemet med dÄliga enhetstester som ger det snabbaste operativsystemet kvarstÄr. Samtidigt vill man ha ett snabbt operativsystem, som Àr enkelt och trevligt att arbeta med. För att inte tala om kvaliteten pÄ den lösning som erhÄlls. Lyckligtvis finns det tekniker som möjliggör snabbare feedback Àn enhetstester. Det handlar om parprogrammering.
NÀr man skriver kod vill man ha feedback om dess kvalitet sÄ snabbt som möjligt. Ja, man kan skriva allt i en feature-branch (för att inte störa nÄgon), göra en pull request pÄ GitHub, utse nÄgon vars Äsikt har vikt, och vÀnta pÄ svar.
Men att vĂ€nta kan ta lĂ„ng tid. Folk Ă€r upptagna, och svaret, Ă€ven om det kommer, kanske inte Ă€r av hög kvalitet. Anta att svaret kom omedelbart, att granskaren snabbt förstod hela idĂ©n, men svaret kommer fortfarande med en försenad tidpunkt, i efterhand. Man vill ha det tidigare. HĂ€r syftar parprogrammering till att möjliggöra just detta â att fĂ„ feedback direkt, i skrivögonblicket.
Nedan presenterar jag stilarna för parprogrammering och deras tillÀmplighet i arbetet med IaC:
1. Klassisk, erfaren + erfaren, byte enligt timer. TvĂ„ roller â förare och navigatör. TvĂ„ personer. De arbetar pĂ„ samma kod och byter roller efter en förutbestĂ€md tidsperiod.
LÄt oss granska kompatibiliteten mellan vÄra problem och stilen:
- Problem: ofullkomlighet hos verktyg, medel för att utveckla kod.
Negativ pÄverkan: lÀngre utvecklingstid, vi blir lÄngsammare, arbetsrytm / tempo störs.
Hur vi hanterar det: vi anvÀnder andra verktyg, gemensam IDE och lÀr oss kortkommandon. - Problem: lÄngsam distribution.
Negativ pÄverkan: ökar tiden för att skapa en fungerande kodbit. Vi blir uttrÄkade under vÀntan, hÀnderna strÀcker sig efter att sysselsÀtta sig med nÄgot annat medan vi vÀntar.
Hur vi hanterar det: vi har inte löst det. - Problem: brist pÄ metoder och praxis.
Negativ pÄverkan: vi har ingen kunskap om vad som Àr bra och vad som Àr dÄligt. Det förlÀnger tiden för att fÄ feedback.
Hur vi hanterar det: utbyte av Äsikter och metoder i pararbete löser nÀstan problemet.
Huvudproblemet med att anvĂ€nda denna stil i IaC Ă€r det ojĂ€mna arbetstempot. I traditionell mjukvaruutveckling har du en mycket jĂ€mn progression. Du kan spendera fem minuter och skriva N. Spendera tio minuter och skriva 2N, femton minuter â 3N. HĂ€r kan du spendera fem minuter och skriva N, för att sedan spendera ytterligare trettio minuter och skriva en tiondel av N. HĂ€r vet du ingenting, du har en blockering, en stillastĂ„ende situation. Att reda ut det tar tid och distraherar frĂ„n sjĂ€lva programmeringen.
Slutsats: i sin rena form passar det inte för oss.
2. Ping-pong. Denna metod innebÀr att en deltagare skriver testet, medan den andra implementerar det. Med tanke pÄ att det Àr komplicerat med enhetstester, och att man mÄste skriva ett tidskrÀvande integrationstest, försvinner hela lÀttheten med ping-pong.
Jag kan sÀga att vi har försökt med att dela upp ansvar för att designa testscenarier och implementera koden för dem. En deltagare kom pÄ scenariot och var ansvarig för detta, han hade det sista ordet. Den andra var ansvarig för implementeringen. Det fungerade bra. Kvaliteten pÄ scenariot ökade med denna metod.
Slutsats: tyvÀrr tillÄter arbetstempot oss inte att anvÀnda ping-pong som en praktik för parprogrammering i IaC.
3. Strong Style. . Idén Àr att en deltagare blir den styrande navigatören, medan den andra tar rollen som utförande drivare. BeslutsrÀtten ligger enbart hos navigatören. Drivaren skriver bara och kan med ord pÄverka det som sker. Roller förÀndras inte under en lÀngre tid.
Passar bra för utbildning, men krÀver starka mjuka fÀrdigheter. HÀr stötte vi pÄ problem. Tekniken gick trögt. Och det handlar inte ens om infrastrukturen.
Slutsats: potentiellt kan det anvÀndas, vi ger inte upp försöken.
4. Mobbing, svÀrmande och alla kÀnda, men inte nÀmnda stilar. behandlas inte, dÄ vi inte har provat dem och kan inte uttala oss om dem i kontexten av vÄrt arbete.
Sammanfattande slutsatser angÄende parprogrammering:
- Vi upplever ett ojÀmnt arbetstempo som skapar problem.
- Vi har kört fast pÄ vÄra otillrÀckliga mjuka fÀrdigheter. Och ÀmnesomrÄdet bidrar inte till att övervinna dessa brister.
- LÄnga tester och verktygsproblem gör parprogrammering segt.
5. Trots detta hade vi ocksĂ„ framgĂ„ngar. Vi kom pĂ„ vĂ„r egen metod "Konvergens â divergens". Jag ska kort beskriva hur den fungerar.
Vi har stÀndiga partners under flera dagar (mindre Àn en vecka). Vi arbetar tillsammans med en uppgift. En tid sitter vi tillsammans: en skriver, den andra observerar som supportteam. Sedan separerar vi ett tag, var och en gör sina egna saker, och sen kommer vi Äterigen tillsammans, synkroniserar oss mycket snabbt, gör nÄgot tillsammans och separerar igen.
Planering och kommunikation
Det sista blocket av metoder för att lösa OS-problem Àr organiseringen av arbetet med sjÀlva uppgifterna. HÀr ingÄr ocksÄ erfarenhetsutbyte som ligger utanför pararbete. LÄt oss övervÀga tre metoder:
1. Uppgifter genom mĂ„ltrĂ€det. Den övergripande ledningen av projektet organiserar vi genom ett trĂ€d som oĂ€ndligt strĂ€cker sig in i framtiden. Tekniskt sett hanteras detta i Miro. Det finns en uppgift â den Ă€r ett delmĂ„l. FrĂ„n den leder antingen mindre mĂ„l eller grupper av uppgifter. FrĂ„n dem gĂ„r sjĂ€lva uppgifterna. Alla uppgifter skapas och hanteras pĂ„ denna tavla.

Detta schema ger ocksÄ Äterkoppling som sker en gÄng om dagen, nÀr vi synkroniserar oss pÄ möten. Att ha en gemensam plan för alla, strukturerad och helt öppen, gör det möjligt för alla att vara medvetna om vad som pÄgÄr och hur lÄngt vi har kommit i vÄr framsteg.
Fördelarna med visuell översikt över uppgifter:
- Orsakssamband. Varje uppgift leder till nÄgot globalt mÄl. Uppgifterna grupperas efter mindre mÄl. DomÀninfrastrukturen Àr i sig ganska teknisk. Det Àr inte alltid uppenbart vilken specifik pÄverkan pÄ affÀren som exempelvis skrivning av en handbok för migrering till en annan nginx har. Att ha ett mÄl bredvid en uppgift gör det mer begripligt.

Orsakssamband Àr en viktig egenskap hos uppgifter. Det besvarar direkt frÄgan: "Gör jag rÀtt saker?" - Parallellitet. Vi Àr nio personer, och det Àr fysiskt omöjligt för alla att kasta sig över en och samma uppgift. Ibland rÀcker inte uppgifterna inom ett omrÄde. Vi tvingas parallellisera arbetet mellan smÄ arbetsgrupper. Under tiden arbetar grupperna en stund med sina uppgifter, och de kan förstÀrkas av nÄgon annan. Ibland lÀmnar personer frÄn denna arbetsgrupp. NÄgon gÄr pÄ semester, nÄgon gör en presentation för konferensen DevOps conf, nÄgon skriver en artikel pÄ Habr. Att veta vilka mÄl och uppgifter som kan göras parallellt blir mycket viktigt.
2. Rotationen av ledare för morgonmöten. PĂ„ standup-mötena har vi stött pĂ„ ett problem â mĂ„nga uppgifter görs parallellt av folk. Ibland hĂ€nger uppgifterna dĂ„ligt ihop och det finns ingen förstĂ„else för vem som gör vad. Ă sikten frĂ„n en annan teammedlem Ă€r mycket viktig. Det Ă€r extra information som kan förĂ€ndra hur uppgiften löses. Visst finns det vanligtvis nĂ„gon med dig, men konsultation och tips Ă€r alltid vĂ€lkomna.
För att förbÀttra denna situation har vi implementerat tekniken "Rotation av standup-ledaren". Nu roterar de enligt en viss lista, och det har en effekt. NÀr det Àr din tur Àr du tvungen att fördjupa dig och förstÄ vad som pÄgÄr för att bra kunna leda scrum-mötet.

3. Intern demo. HjÀlp med att lösa uppgifter genom parprogrammering, visualisering i uppgifts-trÀdet och hjÀlp pÄ scrum-mötena pÄ morgonen Àr bra, men inte perfekt. I paret Àr du begrÀnsad av dina egna kunskaper. Uppgifts-trÀdet hjÀlper till att fÄ en global förstÄelse för vem som gör vad. Och ledaren och kollegorna pÄ morgonmötet kommer inte att fördjupa sig i dina problem. De kan definitivt missa nÄgot.
Lösningen hittades i att demonstrera det arbete som utförts för varandra och sedan diskutera det. Vi trÀffas en gÄng i veckan i en timme och visar detaljer om lösningar pÄ uppgifter vi har arbetat med under den senaste veckan.
Under demonstrationen bör man avslöja detaljerna i uppgiften och definitivt demonstrera dess funktion.
Presentationen kan hÄllas enligt en checklista.1. SÀtt in i kontext. Var kom uppgiften ifrÄn, varför behövdes det överhuvudtaget?
2. Hur har uppgiften lösts tidigare? Till exempel, behövdes massiva mus-klick eller var det överhuvudtaget omöjligt att göra nÄgot.
3. Hur förbÀttrar vi detta. Till exempel: "Titta, nu finns det ett litet skript, hÀr Àr README."
4. Visa hur det fungerar. Det Àr önskvÀrt att direkt genomföra ett anvÀndarscenario. Jag vill ha X, gör Y, ser Z (eller Z). Till exempel, jag distribuerar NGINX, kollar url, fÄr 200 OK. Om ÄtgÀrden tar lÄng tid, förbered i förvÀg sÄ att du kan visa det senare. Det Àr bÀst att inte bryta ner nÄgot en timme före demonstrationen, om det Àr kÀnsligt.
5. Förklara hur vÀl problemet har lösts, vilka svÄrigheter som ÄterstÄr, vad som inte Àr klart och vilka förbÀttringar som kan göras framöver. Till exempel, nu finns det en cli, senare blir det full automation i CI.
Det Àr önskvÀrt att varje talare hÄller sig inom 5-10 minuter. Om din presentation Àr uppenbart viktig och kommer att ta lÀngre tid, kom överens om det i kanalen sre-takeover i förvÀg.
Efter den fysiska delen följer alltid en diskussion i trÄden. HÀr dyker den nödvÀndiga feedbacken upp angÄende vÄra uppgifter.

Som resultat genomförs en enkÀt för att ta reda pÄ nyttan med det som pÄgÄr. Detta ger redan feedback angÄende sjÀlva presentationen och betydelsen av uppgiften.

LÄnga slutsatser och nÀsta steg
Det kan verka som att tonen i artikeln Àr nÄgot pessimistisk. SÄ Àr det inte. De tvÄ grundlÀggande nivÄerna av att fÄ feedback, nÀmligen tester och parprogrammering, fungerar. Inte helt som i traditionell utveckling, men det finns en positiv effekt av detta.
Tester, i deras nuvarande form, ger endast delvis tÀckning av koden. MÄnga konfigurationsfunktioner förblir otestade. Deras pÄverkan pÄ det faktiska arbetet vid kodskrivning Àr lÄg. Men det finns en effekt frÄn integrationstester, och det Àr just de som gör det möjligt att genomföra refaktoriseringar utan rÀdsla. Detta Àr en stor prestation. Dessutom försvinner problemet med att flytta fokus till utveckling i högnivÄsprÄk (vi anvÀnder python, go). För "limmet" krÀvs mÄnga kontroller, vilket inte Àr nödvÀndigt, allmÀn integration rÀcker.
Arbete i par beror mer pÄ de specifika personerna. Det finns faktorer som uppgiften och vÄra mjuka fÀrdigheter. Med vissa fungerar det vÀldigt bra, med andra sÀmre. Det finns definitivt nytta av detta. Det Àr klart att Àven vid otillrÀckligt efterlevande av reglerna för pararbete, pÄverkar sjÀlva faktumet av gemensamt utförande av uppgifter positivt resultatets kvalitet. Personligen tycker jag att det Àr enklare och trevligare att arbeta i par.
Högre nivĂ„er av pĂ„verkan pĂ„ OS â planering och arbete med uppgifter ger definitivt effekter: kvalitativ kunskapsutbyte och förbĂ€ttrad kvalitet pĂ„ utvecklingen.
Korta slutsatser i en rad.
- XP-praktiker fungerar inom IaC, men med lÀgre effektivitet.
- StÀrk det som fungerar.
- TĂ€nk ut egna kompenserande mekanismer och praktiker.
KĂ€lla: habr.com



