
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.
See on minu . Tundub, et .
Esitlused ja videod
- Dry run 2019-04-24
Infrastructure as bash history

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 , 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:
- konfiguratsiooni korduvus: saate vÔtta bash ajaloo, tÀita sealt kÀske, tÔenÀoliselt saate töökeskkonna tulemuseks.
- versioonimine: teate, kes logis sisse ja mida tegi, kuid ei ole garanteeritud, et see viib teid töökeskkonna tulemusele.
- ajalugu: ajalugu, kes ja mida tegi. Ainult te ei saa seda kasutada, kui kaotate serveri.
Mis siis teha?
Infrastructure as Code

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.

SĂŒvendatud andmekandmete arendusprojekti korral oli alateema : 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 , 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.

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

Aja jooksul projekt kasvas ja 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

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

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

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

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

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.
- Ăhel meie kliendil oli privaatne pilv.
- Pilves tellisime virtuaalmasinaid.
- 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

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

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

It's not like , 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

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

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

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

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

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
doneAga 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" ; doneTubli? 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-dirStaatilised analĂŒĂŒsi tööriistad
Eelmise sammu probleemi oleks saanud tuvastada, kui oleksime unustanud jutumÀrgid, selleks on looduses palju vahendeid , neid on tÔeliselt palju ja tÔenÀoliselt leiate oma IDE jaoks lintimise tööriista oma stack'i jaoks.
Keel
Tööriist
bash
Ruby
python
ansible
IaC Testimine: Ăksuse Testid

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 , , , . 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.
- Infrastruktuur jaguneb vÀikesteks tellisteks, nÀiteks Ansible'i rollideks.
- KÀivitub mingi keskkond, olgu see siis docker vÔi virtuaalmasin.
- Sellele testkeskkonnale rakendame oma Ansible'i rolli.
- Kontrollime, et kÔik töötas nagu ootame (teeme testid).
- 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
Chef
Chef
saltstack
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).groupsMida valida? KĂŒsimus on keeruline ja ei ole ĂŒheselt mĂ”istetav, siin on nĂ€ide muudatustest projektides githubâis 2018-2019 aastal:

IaC Testimise Raamistikud
Kuidas kÔik kokku panna ja kÀivitada? VÔib 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
Chef
Terraform
NĂ€ide muudatustest projektides githubâis 2018-2019 aastal:

Molecule vs. Testkitchen

Alguses proovisime :
- Luua virtuaalmasin paralleelselt.
- Kasutage Ansible rolle.
- KĂ€ivitage inspec.
25-35 rolli puhul töötas see 40-70 minutit, mis oli liiga pikk aeg.

JĂ€rgmiseks sammuks oli ĂŒleminek jenkinsile / dockerile / ansibleâile / moleculeâile. Ideoloogiliselt on kĂ”ik sama.
- Lintige playbookâid.
- Lintige rollid.
- KĂ€ivitage konteiner.
- Kasutage Ansible rolle.
- KĂ€ivitage testinfra.
- Kontrollige idempotentsust.

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

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.

JĂ€rgmises infrastruktuuri testimise pĂŒramiidi astmes ilmuvad integreerimistestid. Need on sarnased Unit testidega:
- Infrastruktuur jaguneb vĂ€ikesteks tĂŒkkideks, nĂ€iteks Ansible rollideks.
- KÀivitub mingi keskkond, olgu see siis docker vÔi virtuaalmasin.
- Selle testkeskkonna jaoks rakendatakse palju Ansible rolle.
- Kontrollime, et kÔik toimis nagu ootasime (kÀivitame testid).
- 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.

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.

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.

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

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.

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

Infrastruktuur kui kood on
- Kood hoidlas.
- Inimeste koostöö.
- Infrastruktuuri testimine.
lingid
- Dry run 2019-04-24
- &
Allikas: habr.com
