Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

LĂ€henemine . See on arusaadav. LĂ”ppude lĂ”puks, just nemad andsid vĂ”imaluse konfigureerida tĂ€ielikult virtuaalne andmekeskus: fĂŒĂŒsilisi servereid, riiuleid, vĂ”rgu komponente ei ole ning kogu infrastruktuuri saab kirjeldada skriptide ja konfiguratsioonifailide abil. (Infrastructure as Code) koosneb mitte ainult koodist, mis hoitakse hoidlapis, vaid ka inimestest ja protsessidest, mis seda koodi ĂŒmbritsevad. Kas saame kasutada tarkvaraarenduses kasutatavaid lĂ€henemisi infrastruktuuri haldamiseks ja kirjeldamiseks? Oluline on hoida seda mĂ”tet meeles, kui loete seda artiklit.

Inglise versioon

See on minu esitas . Tundub, et DevopsConf 2019-05-28.

Esitlused ja videod

Infrastructure as bash history

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Oletame, et asute uuele projekti, ja teile öeldakse: 'meil on Infrastructure as Code'. TÔelisuses selgub, Infrastructure as bash history vÔi nÀiteks Documentation as bash history. See on tÀiesti reaalne olukord, nÀiteks kirjeldas sellist juhtumit Denis Lysenko oma ettekandes Kuidas asendada kogu infrastruktuur ja hakata rahulikult magama, ta rÀÀkis, kuidas bash ajaloost saadi korralik infrastruktuur projektis.

MÔningase soovi korral vÔib öelda, et Infrastructure as bash history see on nagu kood:

  1. konfiguratsiooni korduvus: saate vÔtta bash ajaloo, tÀita sealt kÀske, tÔenÀoliselt saate töökeskkonna tulemuseks.
  2. versioonimine: teate, kes logis sisse ja mida tegi, kuid ei ole garanteeritud, et see viib teid töökeskkonna tulemusele.
  3. ajalugu: ajalugu, kes ja mida tegi. Ainult te ei saa seda kasutada, kui kaotate serveri.

Mis siis teha?

Infrastructure as Code

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Isegi sellist kummalist juhtumit nagu Infrastructure as bash history on vÔimalik venitada Infrastructure as Code, kuid kui soovime teha midagi keerulisemat kui vana hea LAMPi server, jÔuame sinna, et seda koodi tuleb mingil moel muuta, tÀiustada ja arendada. Edasi kÀsitleme paralleele Infrastructure as Code ja tarkvaraarenduse vahel.

D.R.Y.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

SĂŒvendatud andmekandmete arendusprojekti korral oli alateema perioodiliselt seadistada SDS: vĂ€ljastame uue vĂ€ljaande — see tuleb rakendada edasisteks testimiseks. Ülesanne on ÀÀrmiselt lihtne:

  • siia logige sisse ssh kaudu ja kĂ€ivitage kĂ€sk.
  • seal kopeerige fail.
  • siin parandage konfi.
  • seal kĂ€ivitage teenus.
  • 

  • PROFIT!

Kirjeldatud loogika jaoks on bash tĂ€iesti piisav, eriti projekti varases staadiumis, kui see alles alustab. See ei ole halb, et kasutate bash'i., kuid aja jooksul tekivad soovid luua midagi sarnast, kuid veidi erinevat. Esimene mĂ”te, mis pĂ€he tuleb: copy-paste. Ja nĂŒĂŒd on meil juba kaks vĂ€ga sarnast skripti, mis teevad peaaegu sama. Aja jooksul on skriptide arv kasvanud ja oleme silmitsi seisnud olukorraga, kus on teatud Ă€riloogika installatsiooni rakendamiseks, mida tuleb erinevate skriptide vahel sĂŒnkroniseerida, mis on ĂŒsna keeruline.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Selgub, et on olemas selline praktika nagu D.R.Y. (Ära Korda Iseennast). Idee on kasutada olemasolevat koodi uuesti. KĂ”lab lihtsalt, kuid me ei jĂ”udnud selleni kohe. Meie puhul oli see lihtne idee: eraldada konfiguratsioonid skriptidest. St. Ă€riloogika, kuidas installatsioon kĂ€ivitub, eraldi, konfiguratsioonid eraldi.

S.O.L.I.D. for CFM

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Aja jooksul projekt kasvas ja loomulik jĂ€tk oli Ansible'i ilmumine. Peamine pĂ”hjus, miks see tekkis, on meeskonnas olemasolev ekspertisus ja see, et bash ei ole mĂ”eldud keerukaks loogikaks. Ansible'i sisemuses on samuti keeruline loogika. Selleks, et keeruline loogika ei muutuks kaoseks, kasutatakse tarkvaraarenduses koodi organiseerimise pĂ”himĂ”tteid. S.O.L.I.D. Samuti mainis nĂ€iteks Grigori Petrov oma ettekandes „Miks IT-spetsialistile on isiklik brĂ€nd oluline“ kĂŒsimust, et inimene, nagu ta on loodud, suudab lihtsamalt töötada teatud sotsiaalsete elementidega, tarkvaraarenduses on need objektid. Kui neid kahte ideed ĂŒhendad ja edasi arendad, siis vĂ”ib mĂ€rgata, et infrastruktuuri kirjeldamisel saab kasutada S.O.L.I.D. et tulevikus oleks lihtsam seda loogikat toetada ja kohandada.

The Single Responsibility Principle

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Iga klass tĂ€idab vaid ĂŒhe ĂŒlesande.

Ärge segage koodi ja looge monoliitseid jumalikke makaronimonstre. Infrastruktuur peaks koosnema lihtsatest plokkidest. Selgub, et kui jagada Ansible'i playbook vĂ€ikesteks tĂŒkkideks, st Ansible'i rollideks, siis on neid lihtsam toetada.

The Open Closed Principle

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Avatud/Suletud pÔhimÔte.

  • Avatud laiendamiseks: tĂ€hendab, et ĂŒksuse kĂ€itumist saab laiendada, luues uusi ĂŒksuse tĂŒĂŒpe.
  • Suletud muutmiseks: kĂ€itumise laiendamise tĂ”ttu ei tohi teha muudatusi koodis, mis neid ĂŒksusi kasutab.

Alguses kÀivitasime testimisstrateegia virtuaalmasinatel, kuid kuna Àri loogika oli eraldi rakendusest, saime probleemideta lisada baremetal installatsiooni.

Liskovi asendamise pÔhimÔte

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Barbara Liskovi asendamise pÔhimÔte. Programmis olevad objektid peavad olema asendatavad oma alamliikide eksemplaridega ilma programmi teostatavuse muutmiseta.

Kui vaadata laiemalt, siis ei ole see konkreetse projekti spetsiifilisus, vaid millega saab tegeleda. S.O.L.I.D., see puudutab CFM-i laiemalt, nÀiteks teises projektis tuleb juurutada kastiversioon Java rakendust erinevate Java, rakenduste serverite, andmebaaside, OS-ide jne peal. Seda nÀidet arvesse vÔttes vaatan edasi teisi pÔhimÔtteid. S.O.L.I.D.

Meie puhul on infrastruktuuri meeskonna seas kokku lepitud, et kui me oleme installinud rolli imbjava vĂ”i oraclejava, siis meil on olemas binaarne kĂ€ivitatav fail java. See on vajalik, kuna ĂŒlemised rollid sĂ”ltuvad sellest kĂ€itumisest, nad ootavad java olemasolu. Samuti vĂ”imaldab see meil asendada ĂŒhe rakenduse / versiooni java teisega, muutmata samas rakenduse juurutamise loogikat.

Probleem peitub selles, et Ansible'is ei saa sellist asja rakendada, tulemusena tekivad meeskonnas mÔned kokkulepped.

Liidese jagamise pÔhimÔte

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Liidese jaotamise pĂ”himĂ”te: "palju liideseid, mis on spetsiaalselt loodud klientide jaoks, on parem kui ĂŒks ĂŒldine liides."

Alguses proovisime kogu rakenduse juurutamise varieeruvust koondada ĂŒhte Ansible playbook'i, kuid see oli keeruline hallata, ja lĂ€henemine, kus meil on vĂ€lisse mÀÀratud liides (kliendi ootus 443 port), vĂ”imaldab meil konkreetse rakenduse jaoks infrastruktuuri komponendina jaotada erinevatest plokkidest.

SÔltuvuse pööramise pÔhimÔte

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

SĂ”ltuvuse pööramise pĂ”himĂ”te: Ülemise tasandi moodulid ei tohiks sĂ”ltuda alumise tasandi moodulitest. MĂ”lemad moodulitĂŒĂŒbid peavad sĂ”ltuma abstraktsioonidest. Abstraktsioonid ei tohiks sĂ”ltuda detailidest. Detailid peavad sĂ”ltuma abstraktsioonidest.

Siin on nÀide, mis pÔhineb antipaternil.

  1. Ühel meie kliendil oli privaatne pilv.
  2. Pilves tellisime virtuaalmasinaid.
  3. Kuid pilve spetsiifilisuse tĂ”ttu sĂ”ltus rakenduse juurutamine sellest, millisele hĂŒperviisorile VM sattus.

See, the high-level logic of application deployment and dependencies flowed down to the underlying levels of the hypervisor, which meant problems when reusing this logic. Ära nii tee.

Interaction

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Infrastructure as code is not just about code; it’s also about the relationships between code and people, about interactions between infrastructure developers.

Bus factor

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Let's assume there's Vasya on your project. Vasya knows everything about your infrastructure; what happens if he suddenly disappears? It's a very real situation, as he could get hit by a bus. Sometimes it happens. If that occurs and knowledge about the code, its structure, how it works, the login credentials, is not distributed within the team, then you may face a number of unpleasant situations. To minimize these risks and share knowledge within the team, various approaches can be used.

Pair DevOpsing

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

It's not like in the joke, where admins drank beer, changed passwords, and a parallel to pair programming. That is, two engineers sit at one computer, one keyboard, and start configuring your infrastructure together: setting up the server, writing Ansible roles, etc. Sounds great, but it didn't work for us. However, specific cases of this practice did work. A new employee comes in, their mentor takes a real task with them, they work together — passing on knowledge.

Another specific case is incident calls. During a problem, a group of on-duty and involved persons gathers, one leader is appointed, who shares their screen and verbalizes their thought process. Other participants follow the leader’s line of thought, peek at tricks from the console, check that a line in the log wasn’t missed, and learn something new about the system. This approach worked more often than not.

Code Review

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Subjectively, the more effective dissemination of knowledge about the infrastructure and how it is structured was done through code review:

  • The infrastructure is described in code in the repository.
  • Changes occur in a separate branch.
  • During a merge request, you can see the delta of changes in the infrastructure.

The highlight here was that reviewers were chosen in rotation, according to a schedule, meaning that with some probability, you would delve into a new part of the infrastructure.

Koodistiil

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Aja jooksul hakkasid arvustuste ajal tekkima erinevad arvamused, kuna arvustajatel oli oma stiil ja nende vaheldumisel sattusid nad kokku erinevate stiili valikutega: 2 tĂŒhikut vĂ”i 4, camelCase vĂ”i snake_case. Selle rakendamine ei Ă”nnestunud kohe.

  • Esimene idee oli soovitada linter'i kasutamist, kuna kĂ”ik on ju insenerid, kĂ”ik on targad. Aga erinevad redigeerijad, operatsioonisĂŒsteemid, see ei ole mugav.
  • See arenes botiks, mis igal probleemsel commit'il kirjutas Slack'i ja lisas linter'i vĂ€ljundi. Aga enamasti oli rohkem tĂ€htsamaid asju, ja kood jĂ€i parandamata.

Roheline ehitusmeister

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Aeg möödub ja oleme jÔudnud jÀreldusele, et ei saa lasta masterisse commite, mis ei lÀbi teatud teste. Voilà! Me leiutasime Roheline ehitusmeister, mis on juba ammu tarkvara arenduses praktiseeritud:

  • Arendustööd kĂ€ivad eraldi harus.
  • Sellel harul kĂ€ivad testid.
  • Kui testid ei lĂ€bi, siis kood ei pÀÀse masterisse.

Selle otsuse vastuvĂ”tmine oli vĂ€ga raskendatud, kuna see pĂ”hjustas palju vaidlusi, kuid see oli seda vÀÀrt, kuna arvustustele hakkasid tulema liitumistaotlused, kus stiili ĂŒle ei vaieldud ja aja jooksul probleemsete kohtade arv hakkas vĂ€henema.

IaC testimine

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Lisaks stiili kontrollimisele saab kasutada ka teisi asju, nĂ€iteks kontrollida, kas teie infrastruktuur tĂ”epoolest suudab paigaldada. VĂ”i kontrollida, et infrastruktuuri muudatused ei tooda rahakaotust. Miks see vĂ”iks vajalik olla? KĂŒsimus on keeruline ja filosoofiline, paremini vastata jutuga, et kunagi oli Powershell'i auto-skaleri, mis ei kontrollinud piirdeolukordi => loodi rohkem virtuaalmasinaid kui vajalik => klient kulutas rohkem raha, kui oli planeeritud. See ei olnud meeldiv, aga see viga oleks olnud tĂ€iesti vĂ”imalik varasemates etappides kinni pĂŒĂŒda.

VĂ”ib kĂŒsida, miks teha keeruline infrastruktuur veelgi keerulisemaks? Infrastruktuuri testid, nagu ka koodile, ei ole lihtsustamise kĂŒsimus, vaid teadmine, kuidas teie infrastruktuur peaks töötama.

IaC testimise pyramida

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

IaC testimine: staatiline analĂŒĂŒs

Kui kohe paigaldatakse kogu infrastruktuur ja kontrollitakse, et see töötab, vÔib selguda, et see vÔtab tohutult aega ja nÔuab palju ressursse. SeetÔttu peaks aluseks olema midagi kiiret, mida on palju ja mis katab mitmeid primitiivseid kohti.

Bash on petlik

Vaatame ĂŒht banaalset nĂ€idet. Valige kĂ”ik failid praegusest kataloogist ja kopeerige need mujale. Esimene asi, mis pĂ€he tuleb:

for i in * ; do 
    cp $i /some/path/$i.bak
done

Aga mis juhtub, kui failinimes on tĂŒhik? No okei, me oleme ju targad, oskame kasutada jutumĂ€rke:

for i in * ; do cp "$i" "/some/path/$i.bak" ; done

Tubli? Ei! Mis siis, kui kataloogis ei ole midagi, st globaalne otsing ei toimi.

find . -type f -exec mv -v {} dst/{}.bak ;

NĂŒĂŒd on tubli? Ei... Unustasime, et failinimes vĂ”ib olla n.

touch x
mv x "$(printf "foonbar")"
find . -type f -print0 | xargs -0 mv -t /path/to/target-dir

Staatilised analĂŒĂŒsi tööriistad

Eelmise sammu probleemi oleks saanud tuvastada, kui oleksime unustanud jutumÀrgid, selleks on looduses palju vahendeid Shellcheck, neid on tÔeliselt palju ja tÔenÀoliselt leiate oma IDE jaoks lintimise tööriista oma stack'i jaoks.

Keel
Tööriist

bash
Shellcheck

Ruby
RuboCop

python
Pylint

ansible
Ansible Lint

IaC Testimine: Üksuse Testid

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Kuidas me nĂ€gime eelmises nĂ€ites, ei ole lintijad kĂ”ikvĂ”imsad ja nad ei saa nĂ€idata kĂ”iki probleemseid kohti. JĂ€tkates sarnaselt tarkvaraarenduses testimisega, tuleb meelde unit testid. Siia tulevad kohe meelde shunit, junit, rspec, pytest. Aga mida siis teha ansible’i, chef’i, saltstack’i jms. jaoks?

Alguses rÀÀkisime S.O.L.I.D. ja sellest, et meie infrastruktuur peaks koosnema vĂ€ikestest tellistest. NĂŒĂŒd on nende aeg.

  1. Infrastruktuur jaguneb vÀikesteks tellisteks, nÀiteks Ansible'i rollideks.
  2. KÀivitub mingi keskkond, olgu see siis docker vÔi virtuaalmasin.
  3. Sellele testkeskkonnale rakendame oma Ansible'i rolli.
  4. Kontrollime, et kÔik töötas nagu ootame (teeme testid).
  5. Otsustame, kas on okei vÔi ei.

IaC Testimine: Üksuse Testimise Tööriistad

KĂŒsimus, mis on testid CFM jaoks? VĂ”ib lihtsalt kĂ€ivitada skripti vĂ”i kasutada selleks valmis lahendusi:

CFM
Tööriist

Ansible
Testinfra

Chef
Inspec

Chef
Serverspec

saltstack
Goss

NĂ€ide testinfra jaoks, kontrollime, et kasutajad test1, test2 oleksid olemas ja kuuluksid gruppi sshusers:

def test_default_users(host):
    users = ['test1', 'test2' ]
    for login in users:
        assert host.user(login).exists
        assert 'sshusers' in host.user(login).groups

Mida valida? KĂŒsimus on keeruline ja ei ole ĂŒheselt mĂ”istetav, siin on nĂ€ide muudatustest projektides github’is 2018-2019 aastal:

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

IaC Testimise Raamistikud

Kuidas kÔik kokku panna ja kÀivitada? VÔib vÔtta ja teha kÔik ise olemasolevate inseneride piisava arvu korral. VÔi vÔib vÔtta valmis lahendused, ehkki neid ei ole just vÀga palju:

CFM
Tööriist

Ansible
Molecule

Chef
Test Kitchen

Terraform
Terratest

NĂ€ide muudatustest projektides github’is 2018-2019 aastal:

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Molecule vs. Testkitchen

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Alguses proovisime kasutada testkitchen'i:

  1. Luua virtuaalmasin paralleelselt.
  2. Kasutage Ansible rolle.
  3. KĂ€ivitage inspec.

25-35 rolli puhul töötas see 40-70 minutit, mis oli liiga pikk aeg.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

JĂ€rgmiseks sammuks oli ĂŒleminek jenkinsile / dockerile / ansible’ile / molecule’ile. Ideoloogiliselt on kĂ”ik sama.

  1. Lintige playbook’id.
  2. Lintige rollid.
  3. KĂ€ivitage konteiner.
  4. Kasutage Ansible rolle.
  5. KĂ€ivitage testinfra.
  6. Kontrollige idempotentsust.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

40 rolli lintimine ja kĂŒmnete testimine vĂ”ttis aega umbes 15 minutit.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Valik sĂ”ltub paljuski mitmest tegurist, nagu kasutatav stekk, meeskonna ekspert ja nii edasi. IgaĂŒhel on enda viis, kuidas lahendada Unit testimise kĂŒsimus.

IaC Testimine: Integreerimistestid.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

JĂ€rgmises infrastruktuuri testimise pĂŒramiidi astmes ilmuvad integreerimistestid. Need on sarnased Unit testidega:

  1. Infrastruktuur jaguneb vĂ€ikesteks tĂŒkkideks, nĂ€iteks Ansible rollideks.
  2. KÀivitub mingi keskkond, olgu see siis docker vÔi virtuaalmasin.
  3. Selle testkeskkonna jaoks rakendatakse palju Ansible rolle.
  4. Kontrollime, et kÔik toimis nagu ootasime (kÀivitame testid).
  5. Otsustame, kas on okei vÔi ei.

Üldiselt ei kontrolli me eraldi sĂŒsteemi elemendi töökindlust nagu unit testides, vaid kontrollime, kuidas server on tervikuna kokku pandud.

IaC Testimine: LÔpp-lÔpuks Testid.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

PĂŒramiidi tipus kohtame End to End teste. See tĂ€hendab, et me ei kontrolli eraldi serveri, eraldi skripti vĂ”i eraldi infrastruktuuri tĂŒkki töökindlust. Me kontrollime, kuidas paljud serverid, mis on kokku liidetud, meie infrastruktuur töötab, nagu me ootasime. Kahjuks ei ole valmis lahendusi, mida olen nĂ€inud, tĂ”enĂ€oliselt seetĂ”ttu, et infrastruktuur on sageli ainulaadne ja seda on keeruline mallida ja luua raamistik selle testimiseks. LĂ”pptulemusena loovad kĂ”ik oma lahendused. KĂŒsitlus on olemas, aga vastust ei ole. SeetĂ”ttu rÀÀgin sellest, mis on olemas, et innustada teisi mĂ”tlema vĂ”i suunata mind, et kĂ”ik, mida me varem ei avastanud, on juba leiutatud.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Projekt, millel on rikkalik ajalugu. Seda kasutatakse suurtes organisatsioonides ja tÔenÀoliselt olete teie kÔigi kaudu olnud kaudselt seotud. Rakendus toetab mitmeid andmebaase, integratsiooni ja nii edasi. Teadmine, kuidas infrastruktuur vÔib vÀlja nÀha, on palju docker-compose faile, ja teadmine, milliseid teste millistes keskkondades kÀivitada, on jenkins.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

See skeem töötas piisavalt kaua, kuni uuringud me ĂŒritasime seda viia Openshift’i. Konteinerid jĂ€id samaks, kuid kĂ€ituskeskkond muutus (tervitused D.R.Y.-le jĂ€lle).

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Uuringu mÔte lÀks kaugemale ja OpenShiftis leiti selline asi nagu APB (Ansible Playbook Bundle), mis vÔimaldab pakkida teadmisi infrastruktuuri juurutamiseks konteinerisse. See tÀhendab, et olemas on reprodutseeritav ja testitav teadmiste punkt, kuidas infrastruktuuri seadistada.

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

KÔik see kÔlas hÀsti, kuni jÀÀnud heterogeense infrastruktuuri taha: testimiseks on meil vajalik Windows. LÔpuks istub teadmine sellest, kuidas, kus ja millal juurutada ning testida, Jenkinsis.

KokkuvÔte

Mida ma Ôppisin, testides 200 000 rida infrastruktuuri koodi

Infrastruktuur kui kood on

  • Kood hoidlas.
  • Inimeste koostöö.
  • Infrastruktuuri testimine.

lingid

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster