I selskapet vÄrt er det en onboarding-prosess for SRE-teamet. Jeg har tatt del i hele denne prosessen fra utviklersiden. Underveis har jeg fÄtt tanker og innsikter som jeg Þnsker Ä dele med andre utviklere. I denne refleksjonsartikkelen snakker jeg om hva som skjer, hvordan det skjer, og hvordan alle skal leve med dette videre.

Fortsettelse av en serie artikler skrevet med inspirasjon fra presentasjoner pÄ vÄrt interne arrangement :
2. Infrastruktur som kode. (Du er her)
3. Generering av Typescript-kontrakter basert pĂ„ C#-modeller. (PĂ„gĂ„râŠ)
4. Introduksjon til Raft-konsensusalgoritmen. (PĂ„gĂ„râŠ)
âŠ
Vi har besluttet Ä opprette et SRE-team, basert pÄ ideene . Vi har valgt programmerere fra vÄre egne utviklere og sendt dem pÄ kurs i flere mÄneder.
Teamet hadde fĂžlgende lĂŠringsoppgaver:
- à beskrive infrastrukturen vÄr, som stort sett er i Microsoft Azure, som kode (Terraform og alt relatert).
- Ă lĂŠre utviklerne Ă„ arbeide med infrastrukturen.
- à forberede utviklerne pÄ vaktarbeid.
Vi innfĂžrer begrepet Infrastruktur som kode
I den vanlige verdensmodellen (klassisk administrasjon) er kunnskap om infrastrukturen i to steder:
- Enten i hodene pÄ eksperter.

- Eller disse opplysningene finnes pÄ maskiner, hvor eksperter kjenner til noen av dem. Men det er ikke sikkert at en utenforstÄende (hvis hele teamet vÄrt skulle dÞ plutselig) kan forstÄ hva som fungerer og hvordan. PÄ maskinen kan det vÊre mange opplysninger: tilgangsrettigheter, cron-jobber, tilknyttede (se ) disker og bare en endelÞs liste over hva som kan skje. Det er vanskelig Ä forstÄ hva som faktisk skjer.

I begge tilfeller havner vi i en felle, hvor vi blir avhengige:
- enten av en person, som er dĂždelig, utsatt for sykdommer, forelskelser, humĂžrforandringer og bare helt vanlig oppsigelser;
- eller av en fysisk fungerende maskin, som ogsÄ kan krasje, bli stjÄlet, gi overraskelser og ulemper.
Det er Äpenbart at lÞsningen er Ä oversette alt til lesbar, vedlikeholdbar, kvalitetskodet.
Dermed er infrastruktur som kode (Infrastructure as Code â IaC) en beskrivelse av all eksisterende infrastruktur i form av kode, samt tilhĂžrende verktĂžy for Ă„ arbeide med det og realisere faktisk infrastruktur fra det.
Hvorfor oversette alt til kodeMennesker er ikke maskiner. De kan ikke huske alt. Reaksjonen til et menneske og en maskin er forskjellig. Alt som er automatisert, fungerer potensielt raskere enn det som gjÞres av mennesker. Det viktigste er én sannhet (single source of truth).
Hvor kommer nye SRE-ingeniÞrer fraSÄ vi har bestemt oss for Ä ansette nye SRE-ingeniÞrer, men hvor finner vi dem? Boken med de riktige svarene () forteller oss: fra utviklere. De jobber med kode, og du oppnÄr den ideelle tilstanden.
Vi har lett mye og lenge etter dem pÄ arbeidsmarkedet utenfor vÄrt selskap. Men vi mÄ innse at vi ikke fant en eneste som passet vÄre Þnsker. Vi mÄtte sjekke blant vÄre egne.
Problemer med infrastruktur som kode
La oss nÄ se pÄ eksempler pÄ hvordan infrastruktur kan vÊre integrert i kode. Koden er godt skrevet, av hÞy kvalitet, med kommentarer og innrykk.
Kodeeksempel fra Terraform.

Kodeeksempel fra Ansible.

Mine damer og herrer, men hvis alt var sÄ enkelt! Vi lever i den virkelige verden, og den er alltid klar til Ä overraske deg, gi deg overraskelser og problemer. Det er ikke uten problemer her heller.
1. Det fĂžrste problemet er at IaC i de fleste tilfeller er en slags DSL.
Og en DSL, pÄ sin side, er en beskrivelse av strukturen. NÊrmere bestemt hva du bÞr ha: Json, Yaml, modifikasjoner fra noen store selskaper som har utviklet sin egen DSL (i Terraform brukes HCL).
Problemet er at det lett kan mangle slike vanlige ting som:
- variabler;
- betingelser;
- noen steder mangler kommentarer, for eksempel er de ikke forhÄndsdefinert i Json;
- funksjoner;
- og jeg har ennÄ ikke nevnt slike hÞyere nivÄer, som klasser, arv og alt det der.
2. Det andre problemet med slik kode er at det oftest er et heterogent miljÞ. Vanligvis sitter du og arbeider med C#, altsÄ med ett sprÄk, én stakk, én Þkosystem. Men her har du et enormt mangfold av teknologier.
Det er en helt reell situasjon der en bash med Python kjÞrer en eller annen prosess, hvor Json settes inn. Du analyserer det, og deretter gir en annen generator ytterligere 30 filer. For alt dette kommer det inn variable fra Azure Key Vault, som hentes av et plugin til drone.io, skrevet i Go, og disse variable passerer gjennom yaml, som ble generert fra templater i jsonnet. Det er ganske vanskelig Ä ha strengt godt beskrevet kode nÄr du har et sÄ variert miljÞ.
Tradisjonell utvikling innenfor en oppgave skjer med ett og samme sprÄk. Her jobber vi med et stort antall sprÄk.
3. Det tredje problemet â er verktĂžyene.. Vi er vant til kule redaktĂžrer (Ms Visual Studio, Jetbrains Rider), som gjĂžr alt for oss. Og selv om vi skulle gjĂžre en feil, vil de si at vi ikke er riktige. Det fĂžles som normalt og naturlig.
Men et sted i nÊrheten er VSCode, som har noen plugins som pÄ en eller annen mÄte installeres, stÞttes eller ikke stÞttes. Nye versjoner kommer ut, men de blir ikke stÞttet. Et banalt skifte til implementeringen av en funksjon (selv om den finnes) blir et vanskelig og ikke-banalt problem. En enkel omdÞpning av en variabel - det er en erstatning i prosjektet fra dusinvis av filer. Heldigvis, hvis den erstatte det som trengs. Det er selvfÞlgelig noen steder med syntaksutheving, autocompletion og noen steder er det formatering (men jeg klarte ikke Ä fÄ det til Ä fungere med terraform pÄ Windows).
Ved tidspunktene artiklen ble skrevet har enda ikke blitt utgitt for Ä stÞtte versjon 0.12, selv om den allerede har vÊrt ute i 3 mÄneder.
Det er pĂ„ tide Ă„ glemmeâŠ
- Debugging.
- Refactoring-verktĂžy.
- Auto fullfĂžring.
- Oppdagelse av feil under kompilering.
Det er morsomt, men dette Þker tiden for utvikling og Þker antall feil som uunngÄelig skjer.
Det mest skremmende er at vi mÄ tenke ikke pÄ hvordan vi skal designe, organisere filene i mapper, dekomponere, gjÞre koden vedlikeholdbar, lesbar og sÄ videre, men pÄ hvordan jeg kan skrive denne kommandoen korrekt, fordi jeg pÄ en eller annen mÄte skrev den feil.
Som nybegynner prĂžver du Ă„ forstĂ„ terraform, men IDE-en hjelper deg ikke i det hele tatt. NĂ„r det finnes dokumentasjon â gĂ„r du inn og ser. Men hvis du begynte med et nytt programmeringssprĂ„k, ville IDE-en ha foreslĂ„tt at det finnes en slik type, og en slik type finnes ikke. I hvert fall pĂ„ nivĂ„et int eller string. Dette er ofte nyttig.
Men hvordan med testene?
Dere spÞr: «Hvordan er det med testene, kjÊre programmerere?» SeriÞse folk tester alt i produksjon, og det er strengt. Her er et eksempel pÄ en enhetstest for et Terraform-modul fra nettstedet. .

De har god dokumentasjon. Microsoft har alltid imponert meg med sin tilnÊrming til dokumentasjon og opplÊring. Men man trenger ikke Ä vÊre onkel Bob for Ä forstÄ at koden her ikke er perfekt. Legg merke til valideringen som er plassert til hÞyre.
Problemet med enhetstesten er at vi kan sjekke om JSON-en er korrekt pĂ„ utgangen. Jeg ga fem parametere, og jeg fikk en JSON som er 2000 linjer lang. Jeg kan analysere hva som skjer her, validere testresultatetâŠ
Det er vanskelig Ä analysere JSON i Go. Men man bÞr skrive i Go, fordi Terraform pÄ Go er god praksis, Ä teste i sprÄket man skriver i. Kodeutformingen er ogsÄ veldig svak. Likevel er dette det beste biblioteket for testing.
Selv Microsoft skriver sine moduler og tester dem pÄ denne mÄten. SelvfÞlgelig er dette Open Source. Alt jeg snakker om kan du komme og reparere. Jeg kan sette meg ned og fikse alt pÄ en uke, open-sourc'e VS Code-plugger, Terraform, lage en plugin for Rider. Kanskje skrive et par analyseverktÞy, legge til lintrere, bidra til testbiblioteket. Jeg kan gjÞre alt dette. Men det er ikke det jeg skal bruke tiden min pÄ.
Beste praksiser for Infrastructure as Code
La oss gÄ videre. Hvis det ikke finnes tester i IaC, hvis IDE og verktÞyene er dÄrlige, sÄ mÄ det i det minste finnes noen beste praksiser. Jeg sÞkte bare i Google Analytics og sammenlignet to sÞk: Terraform beste praksiser og C# beste praksiser.

Hva ser vi? Uutholdelig statistikk som ikke er til vÄr fordel. NÄr det gjelder mengden materiale, er det det samme. Innen C# utvikling er vi faktisk overfylt av materiale, vi har supergode praksiser, det er bÞker skrevet av eksperter, og ogsÄ bÞker skrevet av andre eksperter som kritiserer de bÞkene. Mye offisiell dokumentasjon, artikler, opplÊringskurs, og nÄ ogsÄ open source utvikling.
NÄr det gjelder sÞket om IaC: her mÄ du i det minste prÞve Ä samle informasjon fra foredrag og HashiConf, fra den offisielle dokumentasjonen og utallige problemer pÄ GitHub. Hvordan skal man egentlig dele opp disse modulene, hva skal man gjÞre med dem? Det virker som et reelt problem⊠Det finnes et fellesskap, folkens, hvor du kan fÄ ti kommentarer pÄ GitHub for hvert spÞrsmÄl du har. Men det er ikke sikkert.
Dessverre begynner ekspertene fÞrst nÄ Ä dukke opp. Det er fortsatt for fÄ. Og fellesskapet er fortsatt pÄ et tidlig stadium.
Hvor er alt dette pÄ vei, og hva skal vi gjÞre?
Man kan bare gi opp og gÄ tilbake til C#, til verden av Rider. Men nei. Hvorfor skulle man i det hele tatt gjÞre det, hvis man ikke prÞver Ä finne en lÞsning? Her er mine subjektive konklusjoner. Du kan gjerne argumentere med meg i kommentarfeltet, det vil vÊre interessant.
Personlig satser jeg pÄ flere faktorer:
- Utviklingen innen dette omrÄdet skjer veldig raskt. Jeg viser grafen over sÞkene relatert til DevOps.

Kanskje dette er et hypet tema, men selve faktum at feltet vokser, gir en viss hĂ„p.Hvis noe vokser sĂ„ raskt, vil det nĂždvendigvis dukke opp kloke mennesker som sier hva man skal gjĂžre og hva man ikke skal gjĂžre. Ăkt popularitet kan fĂžre til at noen endelig fĂ„r tid til Ă„ skrive et plugin til jsonnet for vscode, som lar deg hoppe til implementeringen av funksjonen, i stedet for Ă„ lete etter den med ctrl+shift+f. NĂ„r alt utvikler seg, kommer det flere ressurser. Utgivelsen av Google-boken om SRE er et glimrende eksempel pĂ„ dette.
- Det finnes utviklede metoder og praksiser i vanlig utvikling som vi kan bruke med suksess her. Ja, det er noen nyanser med testing og heterogene miljĂžer, samt utilstrekkelig verktĂžy, men det er opparbeidet en enorm mengde praksiser som kan vĂŠre nyttige og hjelpe.
Et banalt eksempel: samarbeid gjennom pair programming. Det hjelper mye med Ä forstÄ. NÄr du har en nabo ved siden av deg som ogsÄ prÞver Ä forstÄ noe, vil dere sammen forstÄ bedre.
ForstÄelsen av hvordan refaktorering gjÞres, hjelper selv i en slik situasjon. Det betyr at du kan endre ikke alt pÄ en gang, men fÞrst navngivningen, sÄ plasseringen, og kanskje dele ut en del, Äh, men her mangler det kommentarer.
Konklusjon
Selv om mine resonnementer kan virke pessimistiske, ser jeg med hÄp mot fremtiden og hÄper oppriktig at vi (og dere) vil lykkes.
Den andre delen av artikkelen er pÄ vei. Der vil jeg fortelle om hvordan vi prÞvde Ä bruke praksiser fra smidig utvikling for Ä forbedre vÄr opplÊringsprosess og arbeid med infrastrukturen.
Kilde: habr.com



