Pradedant nuo antrojo įsipareigojimo, bet koks kodas tampa palikimu, nes pradinės idėjos pradeda skirtis nuo atšiaurios realybės. Tai nėra nei gerai, nei blogai, tai duotybė, su kuria sunku ginčytis ir su juo reikia gyventi. Dalis šio proceso yra pertvarkymas. Infrastruktūros pertvarkymas kaip kodas. Prasideda istorija apie tai, kaip per metus atkurti Ansible ir neišprotėti.
Palikimo gimimas
1 diena: pacientas nulis
Kažkada buvo sąlyginis projektas. Jame buvo „Dev“ kūrimo komanda ir „Ops“ inžinieriai. Jie sprendė tą pačią problemą: kaip įdiegti serverius ir paleisti programą. Problema ta, kad kiekviena komanda šią problemą išsprendė savaip. Projekte buvo nuspręsta naudoti „Ansible“ žinioms sinchronizuoti tarp „Dev“ ir „Ops“ komandų.
89 diena: palikimo gimimas
Patys to nepastebėdami, norėjosi tai padaryti kuo geriau, bet tai pasirodė palikimas. Kaip tai atsitinka?
Turime skubią užduotį, padarykime nešvarų įsilaužimą ir tada sutvarkykime.
Nereikia rašyti dokumentų ir viskas aišku, kas čia vyksta.
Žinau Ansible/Python/Bash/Terraform! Pažiūrėk, kaip aš galiu išsisukti!
Esu Full Stack Overflow Developer ir nukopijavau tai iš stackoverflow, nežinau, kaip tai veikia, bet atrodo šauniai ir išsprendžia problemą.
Dėl to galite gauti nesuprantamo tipo kodą, kuriam nėra dokumentacijos, neaišku, ką jis daro, ar jo reikia, bet problema ta, kad reikia jį sukurti, modifikuoti, pridėti ramentus ir atramas. , dar labiau pablogindamas situaciją.
Iš pradžių sumanytas ir įgyvendintas IaC modelis nebeatitinka vartotojų/verslo/kitų komandų reikalavimų, o laikas keisti infrastruktūrą nustoja būti priimtinas. Šiuo metu ateina supratimas, kad laikas imtis veiksmų.
IaC pertvarkymas
139 diena: ar jums tikrai reikia pertvarkymo?
Prieš skubėdami į refaktorių, turite atsakyti į keletą svarbių klausimų:
Kam tau viso to reikia?
Ar turi laiko?
Ar pakanka žinių?
Jei nežinote, kaip atsakyti į klausimus, tada pertvarkymas baigsis jam net neprasidėjęs arba gali tik pablogėti. Nes turėjau patirties ( Ką sužinojau išbandęs 200 000 infrastruktūros kodo eilučių), tada projektas sulaukė pagalbos prašymo sutvarkyti vaidmenis ir padengti juos testais.
149 diena: Pasiruošimas pertvarkymui
Pirmas dalykas yra pasiruošimas. Nuspręskite, ką darysime. Norėdami tai padaryti, bendraujame, randame problemines sritis ir sugalvojame jų sprendimo būdus. Gautas sąvokas kažkaip įrašome, pavyzdžiui, straipsnį susiliejant, kad iškilus klausimui „kas yra geriausia? arba "kas teisinga?" Mes nepasiklydome. Mūsų atveju mes laikėmės idėjos skaldyk ir valdyk: suskaidome infrastruktūrą į mažus gabalėlius/plytas. Šis metodas leidžia paimti izoliuotą infrastruktūros dalį, suprasti, ką ji daro, padengti ją testais ir pakeisti, nebijant nieko sugadinti.
Pasirodo, kertiniu akmeniu tampa infrastruktūros testavimas ir čia verta paminėti infrastruktūros testavimo piramidę. Lygiai ta pati idėja, kuri yra kuriama, bet skirta infrastruktūrai: pereiname nuo pigių greitųjų testų, kurie tikrina paprastus dalykus, pavyzdžiui, įdubimą, prie brangių pilnaverčių testų, kurie diegia visą infrastruktūrą.
Galimi bandymai
Prieš pradėdamas apibūdinti, kaip atlikome projekto Ansible testus, aprašysiu bandymus ir metodus, kuriuos turėjau anksčiau panaudoti, kad suprasčiau priimtų sprendimų kontekstą.
Diena Nr. -997: SDS teikimas
Pirmą kartą išbandžiau Ansible vykdydamas SDS (programinės įrangos apibrėžtą saugyklą) kūrimo projektą. Šia tema yra atskiras straipsnis Kaip sulaužyti dviračius per ramentus bandant savo paskirstymą, bet trumpai tariant, mes gavome apverstą testavimo piramidę ir testuodami vienam vaidmeniui skyrėme 60-90 minučių, o tai yra ilgas laikas. Pagrindas buvo e2e testai, t.y. įdiegėme visavertį įrenginį ir tada jį išbandėme. Dar labiau apsunkino jo paties dviračio išradimas. Tačiau turiu pripažinti, kad šis sprendimas veikė ir leido stabiliai išleisti.
Diena # -701: Galimybė ir bandomoji virtuvė
Ansible testavimo idėja buvo sukurta naudojant paruoštus įrankius, būtent bandomąją virtuvę / virtuvę-ci ir insp. Pasirinkimą lėmė Ruby žinios (daugiau informacijos rasite straipsnyje apie Habré: Ar YML programuotojai svajoja išbandyti Ansible?) dirbo greičiau, apie 40 minučių 10 vaidmenų. Sukūrėme virtualių mašinų paketą ir atlikome testus.
Apskritai tirpalas veikė, tačiau dėl nevienalytiškumo buvo šiek tiek nuosėdų. Kai testuojamų žmonių skaičius buvo padidintas iki 13 pagrindinių vaidmenų ir 2 meta vaidmenų derinant mažesnius vaidmenis, tada staiga testai pradėjo trukti 70 minučių, tai yra beveik 2 kartus ilgiau. Buvo sunku kalbėti apie XP (ekstremalaus programavimo) praktikas, nes... niekas nenori laukti 70 minučių. Tai buvo priežastis pakeisti požiūrį
Diena # -601: Ansible ir molekulė
Konceptualiai tai panašu į testkitchen, tik mes perkėlėme vaidmenų testavimą į docker ir pakeitėme krūvą. Dėl to laikas sutrumpėjo iki stabilių 20-25 minučių 7 vaidmenims.
Padidinę išbandytų vaidmenų skaičių iki 17 ir sukūrę 45 vaidmenis, tai atlikome per 28 minutes su 2 jenkinų vergais.
167 diena: Ansible testų įtraukimas į projektą
Greičiausiai nebus įmanoma atlikti pertvarkymo užduoties paskubomis. Užduotis turi būti išmatuojama, kad galėtumėte ją susmulkinti į mažus gabalėlius ir šaukšteliu po gabalėlį suvalgyti dramblį. Turi būti supratimas, ar judate teisinga linkme, kiek laiko eiti.
Apskritai nesvarbu, kaip tai bus daroma, galite rašyti ant popieriaus, galite lipdukus užklijuoti ant spintos, galite kurti užduotis „Jira“ arba galite atidaryti „Google“ dokumentus ir užsirašyti esamą būseną ten. Kojos auga nuo to, kad procesas vyksta ne iš karto, jis bus ilgas ir varginantis. Mažai tikėtina, kad kas nors norės, kad pertvarkydami perdegtumėte idėjas, pavargtumėte ir pervargtumėte.
Pertvarkymas yra paprastas:
Valgyk.
Miegoti.
Kodas.
IaC testas.
Pakartoti
ir tai kartojame tol, kol pasieksime numatytą tikslą.
Galbūt nepavyks iš karto pradėti visko testuoti, todėl pirmoji mūsų užduotis buvo pradėti nuo linijavimo ir sintaksės patikrinimo.
181 diena: Green Build Master
Linting yra mažas pirmas žingsnis link Green Build Master. Tai beveik nieko nesugadins, bet leis derinti procesus ir kurti žaliąsias Jenkins versijas. Idėja yra ugdyti komandoje įpročius:
Raudoni testai yra blogi.
Atėjau kažko pataisyti ir tuo pačiu padaryti kodą šiek tiek geresnį nei buvo prieš jus.
193 diena: nuo pūkavimo iki vienetų bandymų
Sukūrę kodo įvedimo į pagrindinį įrenginį procesą, galite pradėti žingsnis po žingsnio tobulinimo procesą - pakeisdami pūkelius paleidimo vaidmenimis, netgi galite tai padaryti be idempotencijos. Turite suprasti, kaip taikyti vaidmenis ir kaip jie veikia.
211 diena: nuo padalinio iki integracijos testų
Kai dauguma vaidmenų yra padengti vienetų testais ir viskas yra sugadinta, galite pereiti prie integravimo testų pridėjimo. Tie. tikrinant ne vieną infrastruktūros plytą, o jų derinį, pavyzdžiui, pilną egzemplioriaus konfigūraciją.
Naudodami jenkins sugeneravome daugybę etapų, kurie lygiagrečiai sujungė vaidmenis / žaidimo knygas, tada vienetų testus konteineriuose ir galiausiai integravimo testus.
Jenkins + Docker + Ansible = testai
Patikrinkite atpirkimą ir generuokite kūrimo etapus.
Iš pradžių refaktorizavimą atliko nedidelė dviejų ar trijų žmonių grupė. Jie peržiūrėjo kodą pagrindiniame kompiuteryje. Laikui bėgant komanda įgijo žinių, kaip rašyti kodą, ir kodo peržiūra prisidėjo prie žinių apie infrastruktūrą ir jos veikimo sklaidos. Svarbiausia čia buvo tai, kad recenzentai buvo atrenkami po vieną, pagal grafiką, t.y. su tam tikra tikimybe pateksite į naują infrastruktūros dalį.
Ir čia turėtų būti patogu. Patogu atlikti apžvalgą, pamatyti, kokios užduoties rėmuose ji buvo atlikta, ir diskusijų istoriją. Mes turime integruotą jenkins + bitbucket + jira.
Tačiau peržiūra nėra panacėja; kažkaip patekome į pagrindinį kodą, kuris privertė mus atlikti flopo testus:
Laikui bėgant buvo daugiau bandymų, kūrimas vyko lėčiau, blogiausiu atveju iki valandos. Ant vieno iš retro buvo tokia frazė kaip „gerai, kad yra bandymų, bet jie lėti“. Dėl to mes atsisakėme virtualių mašinų integravimo testų ir pritaikėme juos „Docker“, kad jis būtų greitesnis. Taip pat testinfra pakeitėme įmanomu tikrintuvu, kad sumažintume naudojamų įrankių skaičių.
Griežtai tariant, buvo priemonių rinkinys:
Perjungti į dokerį.
Pašalinkite vaidmenų testavimą, kuris pasikartoja dėl priklausomybių.
Padidinkite vergų skaičių.
Bandomojo paleidimo tvarka.
Gebėjimas pūkuoti VISKAS vietoje su viena komanda.
Dėl to „Pupeline on jenkins“ taip pat buvo suvienodintas
Juokingiausia, kad žaidimų knygelių rezultatas priklausys nuo dalykų, kurie ne visada yra akivaizdūs, pavyzdžiui, vaidmenų išvardijimo tvarka. Deja, tokia yra Ansible prigimtis ir geriausia, ką galima padaryti, yra naudoti tam tikrą susitarimą, pavyzdžiui, vaidmenyje naudoti tik šiame vaidmenyje aprašytą kintamąjį.
GERAS: kintamųjų vaidmenyse naudokite kintamuosius su priešdėliu vaidmens pavadinimu; tai, peržiūrėjus inventorių, padės lengviau suprasti, kas vyksta.
Sutikome naudoti kintamuosius priešdėlius; nebūtų nereikalinga patikrinti, ar jie apibrėžti taip, kaip tikimės, ir, pavyzdžiui, ar jų nepaiso tuščia reikšmė
GERAS: Patikrinkite kintamuosius.
- name: "Verify that required string variables are defined"
assert:
that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
fail_msg: "{{ ahs_var }} needs to be set for the role to work "
success_msg: "Required variables {{ ahs_var }} is defined"
loop_control:
loop_var: ahs_var
with_items:
- ahs_item1
- ahs_item2
- ahs_item3
Jei vaidmuo tikisi maišos / žodyno viename iš savo parametrų, tada, jei norime pakeisti vieną iš antrinių parametrų, turėsime nepaisyti viso maišos / žodyno, o tai padidins konfigūracijos sudėtingumą.
Vaidmenys ir žaidimų knygelės turi būti idempotentiškos, nes sumažina konfigūracijos nukrypimą ir baimę ką nors sulaužyti. Bet jei naudojate molekulę, tai yra numatytasis elgesys.
Venkite naudoti komandų apvalkalo modulius
Naudojant apvalkalo modulį, vietoj deklaratyviosios, kuri yra Ansible esmė, atsiranda imperatyvioji aprašymo paradigma.
Išbandykite savo vaidmenis per molekulę
Molekulė yra labai lankstus dalykas, pažvelkime į keletą scenarijų.
Molekulė Keli egzemplioriai
В molecule.yml skyriuje platforms galite apibūdinti daugybę prieglobų, kuriuos galite įdiegti.
Molekulėje galima naudoti ansible patikrinti, ar egzempliorius sukonfigūruotas teisingai, be to, tai buvo numatytasis nuo 3 leidimo. Tai nėra tokia lanksti kaip testinfra/inspec, bet galime patikrinti, ar failo turinys atitinka mūsų lūkesčius:
Arba įdiekite paslaugą, palaukite, kol ji taps prieinama, ir atlikite dūmų testą:
---
- name: Verify
hosts: solr
tasks:
- command: /blah/solr/bin/solr start -s /solr_home -p 8983 -force
- uri:
url: http://127.0.0.1:8983/solr
method: GET
status_code: 200
register: uri_result
until: uri_result is not failed
retries: 12
delay: 10
- name: Post documents to solr
command: /blah/solr/bin/post -c master /exampledocs/books.csv
Įdėkite sudėtingą logiką į modulius ir papildinius
Ansible pasisako už deklaratyvų požiūrį, todėl kai atliekate kodo šakojimą, duomenų transformavimą, apvalkalo modulius, kodas tampa sunkiai skaitomas. Norint su tuo kovoti ir nesudėtingai suprasti, nebūtų nereikalinga kovoti su šiuo sudėtingumu kuriant savo modulius.
UPD1 2020.05.01 20:30 val – Galite naudoti pirminiam žaidimų knygų profiliavimui callback_whitelist = profile_tasks suprasti, kas tiksliai veikia ilgą laiką. Tada pereiname Ansible pagreičio klasika. Taip pat galite pabandyti mitogenas UPD2 2020.05.03 16:34 val - Anglų versija