Infrastrukturë si kod: prezantimi i parë

Ne kemi një proces onboarding të ekipit SRE në kompaninë tonë. Unë hyra në të gjithë këtë histori nga ana e zhvillimit. Gjatë procesit kam pasur mendime dhe njohuri që dëshiroj të ndaja me zhvilluesit e tjerë. Në këtë artikull-reflektim, flas për atë që po ndodh, si po ndodh dhe si mundet secili të jetojë me këtë më pas.

Infrastrukturë si kod: prezantimi i parë

Vazhdimi i serisë së artikujve të shkruar mbi bazën e prezantimeve në ngjarjen tonë të brendshme. DevForum:

1. Macja e Schrödinger-it pa kuti: problemi i konsensusit në sistemet e shpërndara.
2. Infrastrukturë si kod. (Ju jeni këtu)
3. Generimi i kontratave Typescript nga modelet c#. (NĂ« proces
)
4. Hyrje në algoritmin e konsensusit Raft. (Në proces
)



Ne vendosëm të formonim një ekip SRE, duke realizuar idetë e google sre. Mblodhëm programuesit nga zhvilluesit tanë dhe i dërguam ata për t'u trajnuar për disa muaj.

Para ekipit u paraqitën këto detyra mësimore:

  • TĂ« pĂ«rshkruajnĂ« infrastrukturĂ«n tonĂ«, e cila pĂ«r pjesĂ«n mĂ« tĂ« madhe ndodhet nĂ« Microsoft Azure, nĂ« formĂ«n e kodit (Terraform dhe gjithçka nĂ« lidhje me tĂ«).
  • TĂ« mĂ«sojnĂ« zhvilluesit pĂ«r tĂ« punuar me infrastrukturĂ«n.
  • TĂ« pĂ«rgatisin zhvilluesit pĂ«r turnet.

Po zhvillojmë konceptin e Infrastrukturës si kod.

Në modelin normal të botës (administrimi klasik) njohuritë mbi infrastrukturën ndodhen në dy vende:

  1. Ose në formën e njohurive në mendjet e ekspertëve.Infrastrukturë si kod: prezantimi i parë
  2. Ose kĂ«to informacione ndodhen nĂ« disa makineri, njĂ« pjesĂ« e tĂ« cilave i dinĂ« ekspertĂ«t. Por nuk Ă«shtĂ« fakt se njĂ« person nga jashtĂ« (nĂ«se e gjitha ekipi ynĂ« papritur ndĂ«rron jetĂ«) do tĂ« mund tĂ« kuptojĂ« se çfarĂ« ndodh. NĂ« makinĂ« mund tĂ« ketĂ« shumĂ« informacione: akseset, punĂ«t cron, disku i montuar (shih disk mounting) dhe njĂ« listĂ« e pafund e asaj qĂ« mund tĂ« ndodhĂ«. ËshtĂ« e vĂ«shtirĂ« tĂ« kuptohet se çfarĂ« ka ndodhur nĂ« tĂ« vĂ«rtetĂ«.InfrastrukturĂ« si kod: prezantimi i parĂ«

Në të dy rastet, ne jemi në një grackë, duke u bërë të varur:

  • ose nga njĂ« person, i cili Ă«shtĂ« mortal, i ndjeshĂ«m ndaj sĂ«mundjeve, dashurive, ndryshimeve tĂ« humorit dhe thjesht pushimeve nga puna;
  • ose nga makineria qĂ« funksionon fizikisht, e cila gjithashtu bie, vjedhet, sjell surpriza dhe shqetĂ«sime.

Natyrisht, zgjidhja duket e qartë, se në mënyrë ideale gjithçka duhet të përkthehet në kod të lexueshëm nga njerëzit, që mirëmbushet dhe është shkruar me cilësi.

Pra pasur infrastrukturen si kod (Infrastructure as Code – IaC) Ă«shtĂ« pĂ«rshkrimi i tĂ«rĂ« infrastrukturĂ«s ekzistuese nĂ« formĂ« kodi, si dhe mjetet pĂ«rkatĂ«se pĂ«r punĂ« me tĂ« dhe pĂ«r realizimin e infrastrukturĂ«s reale nga ky kod.

Pse tĂ« gjitha tĂ« kalohen nĂ« kodNjerĂ«zit nuk janĂ« makina. Ata nuk mund tĂ« mbajnĂ« gjithçka mend. Reagimi i njĂ« njeriu dhe njĂ« makine Ă«shtĂ« ndryshe. Çdo gjĂ« automatike potencialisht punon mĂ« shpejt se çdo gjĂ« qĂ« bĂ«nĂ« njĂ« njeri. MĂ« e rĂ«ndĂ«sishmja Ă«shtĂ« burimi i vetĂ«m i sĂ« vĂ«rtetĂ«s (single source of truth).

Nga vijnĂ« inxhinierĂ«t e rinj SREPra, ne vendosĂ«m tĂ« angazhojmĂ« inxhinierĂ« tĂ« rinj SRE, por nga t’i marrim? Libri me pĂ«rgjigjet e duhura (Google SRE Book) na thotĂ«: nga zhvilluesit. Ata punojnĂ« me kod, dhe ju arrini tĂ« gjendeni nĂ« njĂ« gjendje ideale.

Kemi kërkuar gjatë për ta në tregun e punës jashtë kompanisë sonë. Por e pranojmë se nuk gjetëm asnjë që i plotëson kërkesat tona. Duhej të kërkonim mes të tanishmëve tanë.

Problemet e Infrastructure as Code

Tani le të shohim shembuj se si infrastruktura mund të jetë e inkorporuar në kod. Kodi është shkruar mirë, me cilësi, me komente dhe hapësira.

Shembulli i kodit nga Terraforma.

Infrastrukturë si kod: prezantimi i parë

Shembulli i kodit nga Ansible.

Infrastrukturë si kod: prezantimi i parë

Zotërinj, po sikur të ishte gjithçka kaq e lehtë! Ne jemi në një botë reale, e cila gjithmonë është gati të na befasojë, të na ofrojë surpriza, probleme. As këtu nuk kemi të shmangim problemet.

1. Problemi i parë është se në shumicën e rasteve IaC është një lloj dsl.

Dhe DSL, nga ana e tij, është një përshkrim i strukturës. Më saktë, çfarë duhet të keni: Json, Yaml, modifikime nga disa kompani të mëdha që kanë shpikur dsl-in e tyre (në terraform përdoret HCL).

E keqja është se në të mund të mos ketë lehtësisht ato gjëra aq të njohura për ne si:

  • variablat;
  • kushtet;
  • ndoshta nuk ka komente, pĂ«r shembull, nĂ« Json, pĂ«r default ato nuk janĂ« tĂ« parashikuara;
  • funkcionet;
  • dhe kĂ«tĂ« kam thĂ«nĂ« pa folur pĂ«r gjĂ«ra mĂ« tĂ« avancuara si klasat, trashĂ«gimia dhe tĂ« gjithĂ« atĂ«.

2. Problemi i dytë i këtij kodi është se shpesh herë është një ambient heterogjen. Zakonisht ju punoni me C#, pra me një gjuhë, një stak, një ekosistem. Dhe këtu keni një larmi të madhe teknologjish.

Një situatë mjaft e vërtetë është kur një bash me Python nis një proces, në të cilin futet një Json. Ju e analizoni atë, pastaj një gjenerues tjetër prodhon edhe 30 skedare. Për të gjitha këto, hyjnë variablat nga Azure Key Vault, të cilat janë marrë nga plugini për drone.io, i shkruar në Go, dhe këto variabla kalojnë përmes yaml, i cili rezultoi nga gjenerimi nga templater jsonnet. Mjaft e vështirë të kesh një kod të përshkruar rigorozisht kur ke një ambient kaq të larmishëm.

Zhvillimi tradicional brenda një detyre shkon me një gjuhë. Këtu ne punojmë me një sasi të madhe gjuhësh.

3. Problemi i tretĂ« – Ă«shtĂ« tooling. Jemi tĂ« zakonshĂ«m me redaktorĂ«t e shkĂ«lqyer (Ms Visual Studio, Jetbrains Rider), tĂ« cilĂ«t bĂ«jnĂ« gjithçka pĂ«r ne. Dhe madje, edhe nĂ«se e humbasim fokusin, ata na thonĂ« se nuk kemi tĂ« drejtĂ«. Duket se kjo Ă«shtĂ« normale dhe e natyrshme.

Por diku afĂ«r ka VSCode, i cili ka disa plugina qĂ« instalohen, mbĂ«shteten ose nuk mbĂ«shteten. Dalin versione tĂ« reja dhe ato nuk mbĂ«shteten. NjĂ« kalim banal nĂ« implementimin e funksionit (edhe nĂ«se ekziston) bĂ«het njĂ« problem i komplikuar dhe jo trivial. NjĂ« riemrim i zakonshĂ«m i njĂ« variabli – Ă«shtĂ« njĂ« zĂ«vendĂ«sim nĂ« projekt nga dhjetĂ«ra skedare. Do tĂ« kesh fat nĂ«se zĂ«vendĂ«son atĂ« qĂ« Ă«shtĂ« e nevojshme. Sigurisht, ka ndonjĂ«herĂ« ndriçim, ka auto pĂ«rfundim, diku ka formatim (pavarĂ«sisht se nĂ« Terraform timin nĂ« Windows nuk funksionoi).

Në momentin që po shkruhet ky artikull vscode-terraform plugin nuk e kanë lëshuar ende për mbështetje të versionit 0.12, ndonëse është lëshuar prej 3 muajsh.

Ka ardhur koha të harrohet


  1. Debugging.
  2. Refactoring tool.
  3. Auto completion.
  4. Zbulimi i gabimeve gjatë kompilimit.

ËshtĂ« qesharake, por kjo e rrit kohĂ«n e zhvillimit dhe rrit numrin e gabimeve qĂ« ndodhin pĂ«rherĂ«.

E frikshmja është se ne jemi të detyruar të mendojmë jo se si ta projektojmë, ta rendisim skedarin në dosje, ta dekompozojmë, ta bëjmë të mbështetur, të lehtë për t'u lexuar e kështu me radhë kodin, por se si të shkruaj këtë komandë siç duhet, sepse e kam shkruar ndonjëherë gabim.

Si njĂ« fillestar, ju pĂ«rpiqeni tĂ« kuptoni Terraform, ndĂ«rsa IDE ju ndihmon fare pak. Kur ka dokumentacion – hyni, shikoni. Por nĂ«se do tĂ« ishit duke u njohur me njĂ« gjuhĂ« programuese tĂ« re, IDE do t'ju sugjeronte se ka njĂ« tip tĂ« tillĂ« dhe njĂ« tĂ« tillĂ« nuk ka. TĂ« paktĂ«n, nĂ« nivelin e int ose string. Kjo shpesh Ă«shtĂ« e dobishme.

Por si janë testet?

Do you ask: "What about testing, dear programmers?" Serious professionals test everything in production, and it’s tough. Here’s an example of a unit test for a Terraform module from the site. Microsoft.

Infrastrukturë si kod: prezantimi i parë

They have good documentation. I've always liked Microsoft's approach to documentation and training. But you don't have to be Uncle Bob to realize that the code here is not perfect. Pay attention to the validation, moved to the right.

The problem with the unit test is that we can only check the correctness of the JSON output. I input 5 parameters, and it returned a JSON payload with 2000 lines. I can analyze what’s happening here, validate the test result


It’s hard to analyze JSON in Go. But you should write in Go because Terraform in Go is a good practice of testing in the language you write. The code organization itself is quite weak. However, it is the best library for testing.

Microsoft itself writes its modules, testing them this way. Of course, this is Open Source. Everything I talk about you can come and fix. I can sit down and fix everything in a week, open-source VS Code plugins, Terraform, make a plugin for Rider. Maybe write a couple of analyzers, attach linters, contribute to the testing library. I can do it all. But I shouldn’t be dealing with this.

Best practices for Infrastructure as Code

Let’s move on. If there are no tests in IaC, the IDE and tooling are poor, there should at least be best practices. I simply went into Google Analytics and compared two search queries: Terraform best practices and C# best practices.

Infrastrukturë si kod: prezantimi i parë

What do we see? Ruthless statistics that are not in our favor. In terms of material quantity, it’s the same. In C# development, we are just swimming in material, we have super best practices, there are books written by experts, and also books written by other experts that criticize those books. A sea of official documentation, articles, training courses, and now also open source development.

As for the IaC query: here, you’re trying to gather info from high-load talks or HashiConf, from official documentation, and numerous issues on GitHub. How exactly to distribute these modules, what to do with them? It seems like a real problem
 There is a community, gentlemen, where for any question you will get 10 comments on GitHub. But that’s not certain.

Fatkeqësisht, në këtë moment ekspertët po fillojnë të shfaqen. Deri tani janë shumë të pakët. Ndërsa komuniteti është në fazën e tij fillestare.

Në drejtimin e çfarë shkon gjithçka dhe çfarë të bëjmë

Mund ta lësh gjithçka dhe të kthesh në C#, në botën e rider-it. Po ashtu, pse do të merreshit me këtë, nëse jo për të gjetur një zgjidhje. Më poshtë paraqes përfundimet e mia subjektive. Mund të më diskutoni në komentet, do të ishte interesante.

Personal unë mbështes disa gjëra:

  1. Zhvillimi në këtë fushë po ndodh shumë shpejt. Po sjell një grafik të kërkesave për DevOps.

    Infrastrukturë si kod: prezantimi i parë

    Ndoshta tema është në modë, por vetë fakti se fusha po rritet, ngjall disa shpresa.

    Nëse diçka rritet kaq shpejt, sigurisht që do të shfaqen njerëz të mençur që do të tregojnë se si duhet vepruar, dhe si jo. Rritja e popullaritetit çon në atë që ndoshta dikush do të ketë kohë të përfundojë një plugin për jsonnet për vscode, i cili do të lejojë kalimin në implementimin e funksionit, dhe jo ta kërkosh atë përmes ctrl+shift+f. Kur gjithçka zhvillohet, shfaqen më shumë materiale. Dalja e librit nga google për SRE është një shembull i shkëlqyer për këtë.

  2. Ka metodologji dhe praktika të zhvilluara në zhvillimin e zakonshëm, të cilat mund t'i aplikojmë me sukses këtu. Po, ka nuanca me testimin dhe mjedisin heterogjen, mjete të pamjaftueshme, por është grumbulluar një numër i madh praktikash që mund të jenë të dobishme dhe të ndihmojnë.

    Një shembull banal: puna e përbashkët përmes pair programming. Ai ndihmon shumë për të kuptuar. Kur ke një fqinj pranë, i cili gjithashtu përpiqet të kuptojë diçka, së bashku do ta kuptoni më mirë.

    Kuptimi se si bëhet refaktorizimi ndihmon madje edhe në një situatë të tillë për ta realizuar atë. Pra, ti mund të mos ndryshosh gjithçka menjëherë, por mund të ndryshosh emërtimin, pastaj pozicionin, e më pas ndoshta të veçosh ndonjë pjesë, gjithashtu, oh, këtu mungojnë komentet.

Përfundim

Pavarësisht se arsyetimet e mia mund të duken pesimiste, unë shikoj me shpresë drejt të ardhmes dhe shpresoj sinqerisht që ne (dhe ju) do t'ia dalim.

Më pas po përgatitet pjesa e dytë e artikullit. Në të do të flas për si u përpoqëm të aplikonim praktikat e zhvillimit të përshtatshëm për të përmirësuar procesin tonë të të mësuarit dhe punën me infrastrukturën.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster