Hei, Habr! Tidligere har jeg klaget over livet i paradigmet Infrastructure as Code uten Ä foreslÄ lÞsninger pÄ situasjonen. I dag er jeg tilbake for Ä fortelle hvilke tilnÊrminger og praksiser som kan hjelpe oss Ä komme ut av avgrunnen av fortvilelse og styre situasjonen i riktig retning.

I den forrige artikkelen Jeg delte mine inntrykk av dette feltet, prÞvde Ä reflektere over den nÄvÊrende situasjonen og til og med antydet at standardpraksiser kjent for utviklere kan vÊre til hjelp. Det kan ha sett ut som jeg klaget mye over livet, men det var ingen forslag til hvordan man kunne komme ut av situasjonen.
Hvem er vi, hvor er vi, og hvilke problemer har vi
NÄ er vi i SRE Onboarding Team, som bestÄr av seks programmerere og tre infrastrukturingeniÞrer. Alle prÞver Ä skrive Infrastructure as Code (IaC). Vi gjÞr det fordi vi i utgangspunktet kan skrive kode og har en bakgrunn som «over middels» utviklere.
- Vi har en rekke fordeler: en viss bakgrunn, kunnskap om praksiser, evnen til Ă„ skrive kode, og Ăžnsket om Ă„ lĂŠre noe nytt.
- Og det er en sÄrbar del, som ogsÄ er en ulempe: mangel pÄ kunnskap om infrastrukturens materie.
Teknologibunken vi bruker i vÄr IaC.
- Terraform for Ă„ opprette ressurser.
- Packer for Ă„ bygge bilder. Dette er Windows, CentOS 7 bilder.
- Jsonnet for Ä lage kraftige bygg i drone.io, samt for Ä generere packer json og vÄre Terraform-moduler.
- Azure.
- Ansible for Ă„ forberede bildene.
- Python for hjelpeservere, samt provisjoneringsskripter.
- Og alt dette i VSCode med plugins delt mellom teammedlemmene.
Min konklusjon var slik: jeg prÞvde Ä pÄfÞre (fÞrst og fremst meg selv) optimisme, Þnsket Ä si at vi vil prÞve kjente tilnÊrminger og praksiser for Ä takle utfordringer og vanskeligheter i dette feltet. Akkurat nÄ kjemper vi med slike problemer i IaC:
Ufullkommenhet av verktĂžy og utviklingsmidler.
- Langsom deployering. Infrastruktur er en del av den virkelige verden, som kan vĂŠre treg.
- Mangel pÄ tilnÊrminger og praksiser.
- Vi er nybegynnere og vet lite.
- Ekstrem programmering (XP) skyndter seg til unnsetning.
Ekstrem programmering (XP) skyndter seg til unnsetning.
Alle utviklere er godt kjent med ekstrem programmering (XP) og de praksisene som fĂžlger med. Mange av oss har jobbet med denne tilnĂŠrmingen, og den har vĂŠrt vellykket. SĂ„ hvorfor ikke benytte prinsippene og praksisene som er lagt der for Ă„ overvinne infrastrukturen? Vi har bestemt oss for Ă„ anvende denne tilnĂŠrmingen og se hva som kommer ut av det.
Vurdering av anvendbarheten av XP-tilnÊrmingen til ditt omrÄdeHer er en beskrivelse av miljÞet der XP passer godt, og hvordan det relaterer til oss:
1. Dynamisk skiftende programvarekrav. Vi hadde klart for oss hva det endelige mÄlet var. Men detaljene kan varieres. Vi bestemmer selv retningen vi skal ta, sÄ kravene endres fra tid til annen (for det meste av oss selv). NÄr det gjelder SRE-teamet som bÄde gjÞr automatisering og setter begrensningene for kravene og omfanget av arbeidet, passer dette punktet godt.
2. Risikoer forÄrsaket av faste tidsprosjekter som bruker ny teknologi. Vi kan stÄ overfor risikoer nÄr vi bruker noe vi ikke kjenner til. Og det er 100% vÄrt tilfelle. Hele prosjektet vÄrt er basert pÄ teknologier vi ikke var helt kjent med. Dette er generelt et konstant problem, ettersom det stadig dukker opp mange nye teknologier innen infrastruktur.
3,4. Liten, co-lokalisert utvidet utviklingsteam. Teknologien du bruker, muliggjÞr automatiserte enhets- og funksjonstester. Disse to punktene passer ikke helt for oss. For det fÞrste er vi ikke et co-lokalisert team, og for det andre er vi ni personer, som kan betraktes som et stort team. Selv om mange definisjoner av «stor» team sier at en stor gruppe er 14+ personer.
La oss se pÄ noen praksiser fra XP og hvordan de pÄvirker hastigheten og kvaliteten pÄ tilbakemeldingene.
Prinsippet om tilbakemeldingssyklusen i XP
Etter min forstÄelse er tilbakemelding et svar pÄ spÞrsmÄlet, gjÞr jeg dette riktig, er vi pÄ rett vei? I XP finnes det et guddommelig diagram om dette: tidsbasert tilbakemeldingssyklus. Det interessante er at jo lavere vi befinner oss, jo raskere fÄr vi muligheten til Ä fÄ tilbakemelding for Ä svare pÄ nÞdvendige spÞrsmÄl.

Dette er et ganske interessant tema for diskusjon, for i IT-industrien er det mulig Ä fÄ tilbakemelding raskt. Tenk deg hvor vanskelig det ville vÊre Ä jobbe med et prosjekt i et halvt Är og sÄ fÞrst finne ut at det i begynnelsen ble lagt en feil. Dette skjer bÄde i design og i bygging av komplekse systemer.
I vÄrt tilfelle hjelper IaC oss med tilbakemelding. Jeg gjÞr straks en liten justering i skjemaet ovenfor: utgivelsesplanen har ikke en mÄnedlig syklus, men skjer flere ganger om dagen. Til denne syklusen er det knyttet noen praksiser som vi vil se nÊrmere pÄ.
Viktig: tilbakemelding kan bli lÞsningen pÄ alle de nevnte problemene. Sammen med XP-praksiser kan den trekke oss ut av avgrunnen av fortvilelse.
Hvordan trekke seg selv ut av avgrunnen av fortvilelse: tre praksiser
Tester
Tester nevnes to ganger i XP-tilbakemeldingssyklusen. Dette er ikke tilfeldig. De er ekstremt viktige for hele teknikken med ekstrem programmering.
Det antas at du har enhetstester og akseptansetester. Den fĂžrste gir deg tilbakemelding etter noen minutter, den andre etter noen dager, derfor tar det lengre tid Ă„ skrive dem, og de kjĂžres sjeldnere.
Det finnes en klassisk testpyramide som viser at det bĂžr vĂŠre flere av visse tester.

Hvordan er dette skjemaet anvendelig for oss i IaC-prosjektet? Faktisk⊠ikke i det hele tatt.
- Selv om det bÞr vÊre mange enhetstester, kan det ikke vÊre for mange. Enten tester de noe veldig indirekte. Faktisk kan vi si at vi ikke skriver dem i det hele tatt. Men her er noen anvendelser for slike tester som vi likevel har fÄtt gjort:
- Testing av kode i jsonnet. Dette er for eksempel vÄr byggpipeline i drone, som er ganske komplisert. Kode i jsonnet dekkes godt av tester.
Vi bruker denne . - Tester pÄ skripter som kjÞres ved oppstart av ressursen. Skriptene er skrevet i Python, og dermed kan testene pÄ dem ogsÄ skrives.
- Testing av kode i jsonnet. Dette er for eksempel vÄr byggpipeline i drone, som er ganske komplisert. Kode i jsonnet dekkes godt av tester.
- Potensielt er det mulig Ä sjekke konfigurasjonen i testene, men det gjÞr vi ikke. Det er ogsÄ mulig Ä sette opp validering av konfigurasjonsregler for ressurser gjennom . Men for Terraform er det bare for grunnleggende sjekker, men mange sjekkscenarier er skrevet for AWS. Og vi bruker Azure, sÄ dette passer igjen ikke.
- Komponentintegrasjonstester: her avhenger det av hvordan du klassifiserer dem og hvor du plasserer dem. Men de fungerer egentlig.
Slik ser integrasjonstestene ut.

Dette er et eksempel ved bygging av bilder i Drone CI. For Ä komme til dem mÄ man vente i 30 minutter mens Packer-bildet bygges, deretter ytterligere 15 minutter mens de fullfÞres. Men de finnes!Algoritmen for Ä sjekke bilder
- FÞrst mÄ Packer forberede bildet helt.
- Ved siden av testen er det Terraform med lokal tilstand, som vi bruker til Ă„ rulle ut dette bildet.
- Under utrullingen brukes en liten modul som ligger ved siden av for enklere arbeid med bildet.
- NÄr VM-en er rullet ut fra bildet, kan vi begynne med sjekkene. Hovedsakelig utfÞres sjekkene pÄ maskinen. Vi tester hvordan skriptene fungerte ved oppstart, og hvordan tjenestene fungerer. For dette logger vi inn pÄ den nylig opprettede maskinen via ssh eller winrm for Ä sjekke konfigurasjonsstatusen eller om tjenestene har startet.
- Situasjonen er lik med integrasjonstester og i modulene for Terraform. Her er en kort tabell som forklarer egenskapene til slike tester.

Tilbakemelding pÄ pipelinen tar omtrent 40 minutter. Alt gÄr veldig sakte. Det kan brukes til regresjonstesting, men for ny utvikling er det helt urealistisk. Hvis man forbereder seg skikkelig, setter opp kjÞringer og skripter, kan man kanskje redusere det til 10 minutter. Men det er fortsatt ikke enhetstester, som kan kjÞre 100 tester pÄ 5 sekunder.
Mangelen pÄ enhetstester ved bygging av bilder eller Terraform-moduler gjÞr at arbeidet mÄ overlates til separate tjenester, som kan kontaktes via REST, eller til Python-skripter.
For eksempel mÄtte vi gjÞre det slik at nÄr den virtuelle maskinen startet, registrerte den seg i tjenesten , og da virtuelle maskinen ble Þdelagt, fjernet den seg selv.
Siden ScaleFT er en tjeneste, mÄ vi jobbe med den gjennom API-et. Det ble skrevet en innpakning som vi kan bruke til Ä si: «GÄ inn og fjern dette, dette». Den lagrer alle nÞdvendige innstillinger og tilgang.
Vi kan nÄ skrive ordentlige tester for dette, siden det ikke skiller seg fra vanlig programvare: vi lager en mock av et API, du kontakter det, og ser hva som skjer.

Resultater fra testene: Enhetstesting, som burde gi OS feedback pÄ ett minutt, gir ikke dette. HÞyere nivÄer av testing gir resultater, men dekker bare en del av problemene.
Parprogrammering
Tester er selvfÞlgelig bra. Du kan skrive mange av dem, de kan vÊre av forskjellige typer. De vil fungere pÄ sine nivÄer og gi oss tilbakemelding. Men problemet med dÄrlige enhetstester, som gir det raskeste OS, vedvarer. Samtidig Þnsker man et raskt OS, det er lett og behagelig Ä jobbe med. Ikke Ä snakke om kvaliteten pÄ lÞsningen som oppnÄs. Heldigvis finnes det teknikker som gir enda raskere tilbakemelding enn modulÊre tester. Det er pareprogrammering.
NÄr du skriver kode, vil du ha tilbakemelding om kvaliteten sÄ raskt som mulig. Ja, du kan skrive alt i en funktionsgren (for ikke Ä Þdelegge noe for noen), lage en pull request pÄ GitHub, tildele den til noen med relevant mening, og vente pÄ svar.
Men ventetiden kan bli lang. Folk er travle, og svaret, selv om det kommer, kan ha lav kvalitet. La oss anta at svaret kom umiddelbart, og gjennomgangen umiddelbart forsto hele hensikten, men svaret kommer fortsatt med forsinkelse, i ettertid. Og man Ăžnsker det tidligere. Det er nettopp derfor pareprogrammering er rettet mot â for Ă„ fĂ„ tilbakemelding umiddelbart, i lĂžpet av skriveprosessen.
Her presenterer jeg stilene for pareprogrammering og deres anvendelighet i arbeidet med IaC:
1. Klassisk, Erfaren + erfaren, bytte etter et tidsintervall. To roller â driver og navigator. To personer. De jobber med samme kode og bytter roller etter en bestemt tid som er forhĂ„ndsbestemt.
La oss se pÄ kompatibiliteten mellom vÄre problemer og stilen:
- Problem: ufullkommenhet i verktĂžyene for kodeutvikling.
Negativ innvirkning: lengre utvikling, vi bremser, arbeidsrytmen gÄr i stykker.
Hvordan vi takler det: vi bruker andre verktĂžy, felles IDE og lĂŠrer hurtigtaster. - Problem: langsom distribusjon.
Negativ innvirkning: Ăžker tiden det tar Ă„ lage en fungerende del av koden. Vi kjeder oss mens vi venter, hendene fristes til Ă„ gjĂžre noe annet mens vi venter.
Hvordan vi takler det: vi har ikke lÞst det. - Problem: mangel pÄ tilnÊrminger og praksiser.
Negativ innvirkning: ingen kunnskap om hva som er bra eller dÄrlig. Forlenger tilbakemeldingstiden.
Hvordan vi takler det: utveksling av meninger og praksiser i paret nesten lĂžser problemet.
Hovudproblemet med Ä bruke denne stilen i IaC er den ujevne arbeidsflyten. I tradisjonell programvareutvikling har en veldig jevn flyt. Du kan bruke fem minutter pÄ Ä skrive N. Bruke ti minutter pÄ Ä skrive 2N, og 15 minutter pÄ Ä skrive 3N. Her kan du bruke fem minutter pÄ Ä skrive N, og deretter bruke enda 30 minutter og skrive en tidel av N. Her vet du ingenting, du stÄr fast, det stopper opp. à finne lÞsninger tar tid og avleder fra selve programmeringen.
Konklusjon: I sin rene form passer det ikke for oss.
2. Ping-pong. Denne tilnÊrmingen innebÊrer at én deltaker skriver testen, mens en annen lager implementeringen for den. Med tanke pÄ at alt med enhetstester er komplisert, og man mÄ bruke mye tid pÄ Ä skrive integrasjonstester, forsvinner all enkelhet i ping-pong.
Jeg kan si at vi har prĂžvd Ă„ dele ansvaret for Ă„ utforme testscenarier og implementere koden for dem. Ăn deltaker fant pĂ„ scenariet, og i denne delen av arbeidet var han ansvarlig, og han hadde det siste ordet. Den andre var ansvarlig for implementeringen. Dette fungerte bra. Kvaliteten pĂ„ scenariene Ăžkte med denne tilnĂŠrmingen.
Konklusjon: dessverre tillater arbeidsflyten ikke Ă„ bruke ping-pong som en praksis for parprogrammering i IaC.
3. Strong Style. Godt egnet for lÊring, men krever sterke soft skills. Her stoppet vi ogsÄ. Teknikken var vanskelig Ä fÞlge. Og det handler ikke engang om infrastrukturen.
Konklusjon: potensielt kan det brukes, vi gir ikke opp forsĂžket.
4. Mobbing, swarming og alle kjente, men ikke nevnte stiler
vurderes ikke, siden vi ikke har prÞvd dem og ikke kan si noe om dem i konteksten av vÄrt arbeid. Generelle oppsummeringer om bruk av parprogrammering:
Vi har en ujevn arbeidsflyt som skaper forstyrrelser.
- Vi har stÞtt pÄ utilstrekkelige soft skills. Og fagfeltet bidrar ikke til Ä overvinne disse manglene.
- Langvarige tester og problemer med verktĂžyene gjĂžr parprogrammering vanskelig.
- DÄrlig stÞtte i omgivelser og verktÞy gjÞr utviklingsprosessen treig.
5. Til tross for dette var det ogsĂ„ suksesser. Vi utviklet vĂ„r egen metode kalt «Sammenkomst â adskillelse». Jeg skal kort beskrive hvordan den fungerer.
Vi har faste partnere i flere dager (mindre enn en uke). Vi lÞser en oppgave sammen. En stund sitter vi sammen: en skriver, den andre sitter og observerer, som et supportteam. Deretter separerer vi oss en stund, hver gjÞr sine egne ting, sÄ mÞtes vi igjen, synkroniserer oss raskt, jobber sammen og sÄ skilles vi igjen.
Planlegging og kommunikasjon
Den siste blokken med praksiser hvor vi lÞser OS-problemer er organisering av arbeidet med oppgavene selv. Her inngÄr ogsÄ erfaringsutveksling som skjer uten pararbeid. La oss se pÄ tre praksiser:
1. Oppgaver gjennom mĂ„ltreet. Den generelle prosjektledelsen har vi organisert gjennom et tre som strekker seg uendelig inn i fremtiden. Teknisk sett fĂžres dette i Miro. Det er Ă©n oppgave â den er et mellomliggende mĂ„l. Fra den gĂ„r det enten mindre mĂ„l eller grupper av oppgaver. Fra dem gĂ„r det egen oppgaver. Alle oppgaver opprettes og fĂžres pĂ„ denne tavlen.

Denne ordningen gir ogsĂ„ tilbakemelding, som skjer en gang om dagen nĂ„r vi synkroniserer oss i mĂžter. Ă
ha en felles plan, som er strukturert og helt Äpen, gjÞr at alle er oppdatert pÄ hva som skjer og hvor langt vi har kommet i fremdriften.
Fordeler med visuell oversikt av oppgaver:
- Ă
rsakssammenheng. Hver oppgave fĂžrer til et overordnet mĂ„l. Oppgavene grupperes etter mindre mĂ„l. Domenen for infrastruktur er i seg selv ganske teknisk. Det er ikke alltid helt klart hvilket konkret innvirkning, for eksempel, Ă„ skrive en hĂ„ndbok for migrering til en annen nginx, har pĂ„ bedriften. Ă
ha et mÄlkort ved siden av gjÞr dette mer forstÄelig.

à rsakssammenheng er en viktig egenskap ved oppgaver. Den svarer direkte pÄ spÞrsmÄlet: «GjÞr jeg det riktige?» - Parallellitet. Vi er ni personer, og det er fysisk umulig Ä kaste seg over én oppgave samtidig. Det er ikke alltid nok oppgaver fra ett omrÄde. Vi mÄ nÞdvendigvis parallellisere arbeidet mellom smÄ arbeidsgrupper. PÄ denne mÄten jobber gruppene en stund med sin oppgave, og de kan bli styrket av noen andre. Personer kan noen ganger forlate denne arbeidsgruppen. Noen tar ferie, noen holder en presentasjon pÄ DevOps-konferansen, noen skriver en artikkel pÄ Habr. Det blir veldig viktig Ä vite hvilke mÄl og oppgaver som kan gjÞres parallelt.
2. Rotasjon av ledere for morgenmĂžtene. Det oppstod et problem i standup-mĂžtene - mange oppgaver blir gjort parallelt. Noen ganger er oppgavene svakt knyttet til hverandre og det er ikke klart hvem som gjĂžr hva. Men meningen til enda et teammedlem er veldig viktig. Dette er tilleggsinformasjon som kan endre utfallet av oppgavelĂžsningen. Selv om det vanligvis er noen i par med deg, er konsultasjoner og tips aldri overflĂždige.
For Ä forbedre denne situasjonen har vi tatt i bruk teknikken "Skifte av leder for standup". NÄ roterer de etter en bestemt liste, og dette har en effekt. NÄr det blir din tur, blir du tvunget til Ä dykke inn og forstÄ hva som skjer for Ä kunne lede scrum-mÞtet godt.

3. Internt demo. Hjelp til oppgavelĂžsning fra parprogrammering, visualisering pĂ„ oppgavetreet og hjelp pĂ„ scrum-mĂžtene om morgenen â det er bra, men ikke perfekt. I par er man begrenset av ens egne kunnskaper. Oppgavetreet hjelper til med Ă„ forstĂ„ globalt hvem som gjĂžr hva. Lederen og kolleger pĂ„ morgenmĂžtet vil ikke dykke dypt inn i problemene dine. De kan definitivt gĂ„ glipp av noe.
LÞsningen ble funnet i Ä demonstrere gjort arbeid for hverandre og deretter diskutere det. Vi samles en gang i uken i en time og viser detaljer om lÞsningene pÄ oppgavene vi har gjort den siste uken.
Under demonstrasjonen mÄ man avdekke detaljene i oppgaven og sÞrge for Ä vise hvordan den fungerer.
Foredraget kan ledes etter en sjekkliste.1. Sett i kontekst. Hvor kom oppgaven fra, hvorfor var dette nĂždvendig?
2. Hvordan ble oppgaven lĂžst fĂžr? For eksempel var det nĂždvendig med masse musklikk, eller var det umulig Ă„ gjĂžre noe som helst.
3. Hvordan forbedrer vi dette. For eksempel: "Se, nÄ er det et skript, her er readme."
4. Vis hva det er som skjer. Det er Þnskelig Ä demonstrere et brukerscenario direkte. Jeg vil ha X, gjÞr Y, ser Z (eller Y). For eksempel, jeg deployer NGINX, checker URL-en, fÄr 200 OK. Hvis handlingen tar lang tid, forbered pÄ forhÄnd, sÄ vi kan vise det senere. Det er best om det ikke er noe som bryter sammen en time fÞr demoen.
5. Forklar hvor godt problemet er lÞst, hvilke vanskeligheter som gjenstÄr, hva som ikke er fullfÞrt, og hvilke forbedringer som kan bli gjort videre. For eksempel, nÄ er det CLI, senere vil det vÊre full automatisering i CI.
Hver taler bÞr forsÞke Ä holde seg innen 5-10 minutter. Hvis ditt innlegg helt Äpenbart er viktig og vil ta lengre tid, avtal dette pÄ forhÄnd i sre-takeover-kanalen.
Etter den fysiske delen er det viktig Ä ha en diskusjon i trÄden. Her dukker vÄr nÞdvendige tilbakemelding pÄ oppgavene opp.

Til slutt vil det bli gjennomfÞrt en undersÞkelse for Ä vurdere nytteverdien av det som har skjedd. Dette er tilbakemelding pÄ selve presentasjonen og viktigheten av oppgaven.

Lange konklusjoner og hva sÄ.
Det kan virke som tonen i artikkelen er litt pessimistisk. Det er ikke tilfellet. To grunnleggende nivÄer av tilbakemelding, nemlig tester og parprogrammering, fungerer. Ikke like perfekt som i tradisjonell utvikling, men den positive effekten er der.
Tester, i sin nÄvÊrende form, gir bare delvis dekning av koden. Mange konfigurasjonsfunksjoner viser seg Ä vÊre upÄvirket. Deres innvirkning pÄ det direkte arbeidet ved skriving av kode er lav. Men effekten av integrasjonstester er der, og det er disse som tillater oss Ä gjennomfÞre refaktoreringer uten frykt. Dette er en stor prestasjon. OgsÄ med skiftet fokus mot utvikling i hÞyere programmeringssprÄk (vi bruker Python, Go) forsvinner problemet. Man trenger ikke mange sjekker pÄ 'limet', det holder med generell integrasjon.
Pararbeid er mer avhengig av de spesifikke menneskene. Det er faktoren av oppgaven og vÄre myke ferdigheter. Med noen fungerer det veldig bra, med andre mindre bra. Det er definitivt en fordel. Det er klart at selv ved utilstrekkelig overholdelse av reglene for pararbeid, pÄvirker det positive resultatet kvaliteten. Personlig synes jeg det er enklere og hyggeligere Ä jobbe i par.
Mer hĂžy-nivĂ„ mĂ„ter Ă„ pĂ„virke OS â planlegging og arbeid med oppgaver gir absolutt resultater: kvalitetsutveksling av kunnskap og forbedring av utviklingskvalitet.
Korte konklusjoner pÄ én linje
- XP-praksis fungerer i IaC, men med lavere effektivitet.
- Styrk det som fungerer.
- Lag dine egne kompenserende mekanismer og praksiser.
Kilde: habr.com



