ansible devops codestyle
Hey! UnĂ« quhem Punoj inxhinier nĂ« departamentin e automatizimit tĂ« proceseve tĂ« zhvillimit. Ădo ditĂ«, pĂ«rditĂ«sime tĂ« reja aplikacionesh zbarkojnĂ« nĂ« qindra servera tĂ« kompanisĂ«. NĂ« kĂ«tĂ« artikull, unĂ« ndaj pĂ«rvojĂ«n time tĂ« pĂ«rdorimit tĂ« Ansible pĂ«r kĂ«to qĂ«llime.
Ky udhëzues ofron një mënyrë për të organizuar variablat në implantim. Udhëzuesi është e destinuar për ata që tashmë përdorin role në playbook-at e tyre dhe kanë lexuar , por përballen me probleme të tilla:
- Duke gjetur një variabël në kod, është e pamundur të kuptohet menjëherë për çfarë qëllimi është ajo;
- Ka disa role, dhe duhet t'i lidhni variablat me një vlerë, por nuk po arrini dot;
- Shfaqen vështirësi në shpjegimin për të tjerët se si funksionon logjika e variablave në playbook-at tuaj.
Ne u përballëm me këto probleme në projektet tona në kompani, për pasojë ne arritëm në rregulla për dekorimin e variablave në playbook-at tona, të cilat në njëfarë mënyre zgjidhin këto probleme.

Variablat në role
Një rol është një Objekt i veçantë i sistemit të implantimit. Ashtu si çdo objekt tjetër në sistem, ai duhet të ketë një ndërfaqe me sistemin tjetër. Kjo ndërfaqe janë variablat e rolit.
Le të marim, për shembull, rolin api, i cili instalon një aplikacion Java në server. Cilat variabla mund të ketë?

Variablat e rolit mund të ndahen në 2 tipe sipas kategorisë:
1. Pronat
a) të pavarura nga mjedisi
b) të varura nga mjedisi
2. Lidhjet
a) dëgjues
b) kërkesa brenda sistemit
c) kërkesa në mjedis
Pronat e variablave â janĂ« variabla qĂ« pĂ«rcaktojnĂ« sjelljen e rolit.
Variablat e kĂ«rkesĂ«s â janĂ« variabla, vlera e tĂ« cilave pĂ«rdoret pĂ«r tĂ« pĂ«rcaktuar burime tĂ« jashtme, nĂ« lidhje me rolin.
Variablat dĂ«gjues â janĂ« variabla, vlera e tĂ« cilave pĂ«rdoret pĂ«r tĂ« formuar variablat e kĂ«rkesĂ«s.
Nga ana tjetĂ«r, 1a, 2a, 2b â janĂ« variabla qĂ« nuk varen nga mjedisi (hardueri, burime tĂ« jashtme, etj.) dhe mund tĂ« mbushen me vlera default nĂ« defaults e rolit. MegjithatĂ«, variablat e tipit 1b dhe 2c nuk mund tĂ« mbushen me asgjĂ« tjetĂ«r pĂ«rveç âexampleâ, pasi ato do tĂ« ndryshojnĂ« nga njĂ« ambient nĂ« tjetrin.
Stili i kodit
- Emri i variablit duhet të fillojë domosdoshmërisht me emrin e rolit. Kjo do të lehtësojë më vonë gjetjen e variablës dhe për çfarë qëllimi është ajo.
- Kur përdorni variablat në role, duhet patjetër të ndiqni parimin e kapsulimit dhe të përdorni variablat e përcaktuara ose në vetë rolin, ose në rolet nga të cilat varësia aktuale varet.
Përpiquni të mos përdorni fjalorë për variablat. Ansible nuk lejon që të ribëni lehtësisht përcaktimin e vlerave të veçanta në një fjalor.
Shembulli i një variable të keqe:
myrole_user: login: admin password: adminKëtu login është një variabël e pavaruese, ndërsa password është e varur. Por
pasi që ato janë të kombinuara në një fjalor, do t'ju duhet ta përcaktoni atë plotësisht
gjithmonĂ«. Ăka Ă«shtĂ« shumĂ« e pakĂ«ndshme. MĂ« mirĂ« kĂ«shtu:myrole_user_login: admin myrole_user_password: admin
Variablat në playbook-et e depolimit
Kur përpiloni një playbook depolimi (në vijim playbook), ne ndjekim rregullin që ai duhet të vendoset në një repo të veçantë. Ashtu si rolet: secila në repo e vet git. Kjo lejon të kuptohet se rolet dhe playbook janë objekte të pavarura të sistemit të depolimit, dhe ndryshimet në një objekt nuk duhet të ndikojnë në funksionimin e tjetrit. Kjo arrin duke ndryshuar vlerat parazgjedhëse të variablave.
Gjatë përpilimit të playbook-ut, nëse e përgjithësojmë, ekziston mundësia për të ribërë vlerat parazgjedhëse të variablave të rolit në dy vende: në variablat e playbook-ut dhe në variablat e inventarit.
mydeploy # Katalogu i depolimit
âââ deploy.yml # Playbook-u i depolimit
âââ group_vars # Katalogu i variablave tĂ« playbook-ut
â  âââ all.yml # Skedari pĂ«r variablat e lidhjes sĂ« tĂ« gjithĂ« sistemit
â  âââ myapi.yml # Skedari i variablave tĂ« pronave tĂ« grupit myapi
âââ inventories #
âââ prod # Katalogu i mjedisit prod
  âââ prod.ini # Skedari i inventarit
  âââ group_vars # Katalogu pĂ«r variablat e inventarit
    âââ myapi #
      âââ vars.yml # Variablat e pavaruara tĂ« grupit myapi
      âââ vault.yml # Sekretet ( gjithmonĂ« tĂ« pavaruara) ** â
Dallimi është se variablat e playbook-ut përdoren gjithmonë kur thirren playbook-et, të vendosura me të në të njëjtën nivel. Kështu që, këto variabla janë të përshtatshme për të ndryshuar vlerat parazgjedhëse të variablave që nuk varen nga mjedisi. Dhe, përkundrazi, variablat e inventarit do të përdoren vetëm për mjedisin specifik, që është ideale për variablat që varen nga mjedisi.
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se prioriteti i variablave nuk do t'ju lejojĂ« tĂ« tejkaloni variablat mĂ« parĂ« nĂ« variablat e playbook-ut dhe pastaj ndaras nĂ« njĂ« inventar.
Kjo do të thotë se në këtë fazë duhet të përcaktoni nëse variabla është e varur nga mjedisi apo jo dhe ta vendosni në vendin e duhur.
Për shembull, në një projekt, variabla që përfshin aktivizimin e SSL ishte për një kohë të gjatë e varur nga mjedisi, pasi nuk mund të aktivizonim SSL për arsye që nuk varet prej nesh në një nga përshtatjet. Pasi e zgjidhëm këtë problem, ajo u bë e pavarur nga mjedisi dhe u transferua në variablat e playbook-ut.
Variablat e pronave për grupet
Le të zgjerojmë modelin tonë në figurën 1, duke shtuar 2 grupe serverash me një aplikacion tjetër Java, por me konfigurime të ndryshme.

Le të paraqesim se si do të duket playbook-u në këtë rast:
- hosts: myapi
roles:
- api
- hosts: bbauth
roles:
- auth
- hosts: ghauth
roles:
- authNe kemi tre grupe në playbook, prandaj rekomandohet menjëherë të krijoni aq shumë skedarë grupesh në group_vars të variablave të inventarit dhe të playbook-ut. Një skedar grupi në këtë rast është përshkrimi i një komponente të aplikacionit tuaj në playbook. Duke hapur skedarin e grupit në variablat e playbook-ut, menjëherë shihni të gjitha dallimet nga sjellja e defoltit të roleve të instaluara në grup. Në variablat e inventarit: dallimet në sjelljen e grupit nga përshtatja në përshtatje.
Stili i Kodit
- Kërkoni të mos përdorni fare variablat host_vars, pasi ato nuk përshkruajnë sistemin, por vetëm një rast të veçantë, çka në perspektivë do të çojë në pyetje: "Pse ky host ndryshon nga të tjerët?", për të cilin përgjigjja nuk është gjithmonë e lehtë të gjendet.
Variablat e lidhjes
Megjithatë, kjo është ajo që ka të bëjë me variablat e pronave, por si të jetë me variablat e lidhjes?
Dallimi i tyre është se ato duhet të kenë të njëjtin vlerë në grupe të ndryshme.
Në fillim ishim duke përdorur një strukturë monstruoze si:
hostvars[groups['bbauth'][0]]['auth_bind_port'], por menjëherë u hoq
pasi ka disavantazhe. E para, voluminoziteti. E dyta, varësia nga një host specifik në grup. E treta, është e nevojshme që para se të filloni deployimin të mbledhni fakte nga të gjitha hostet, nëse nuk dëshirojmë të marrim një gabim të variablit të pacaktuar.
Si rezultat, u vendos të përdoren variablat e lidhjes.
Variablat e lidhjes â kĂ«to janĂ« variabla qĂ« i pĂ«rkasin playbook-ut, dhe nevojiten pĂ«r lidhjen e objekteve tĂ« sistemit.
Variablat e lidhjes plotësohen në variablat e zakonshme të sistemit. group_vars/all/vars dhe formohen duke nxjerrë të gjitha variablat e dëgjuesve nga çdo grup, dhe duke shtuar në fillim të variablës emrin e grupit nga i cili është nxjerrë dëgjuesi.
Kështu sigurohet njëndjershmëri dhe pa përplasje emrash.
Le të përpiqemi të lidhim variablat nga shembulli më sipër:

Imagjinoni se kemi variabla që varen nga njëri-tjetri:
# roles/api/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń Đ·Đ°ĐżŃĐŸŃа
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"
# roles/auth/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń ŃĐ»ŃŃаŃДлŃ
auth_bind_port: "20000"Të nxjerrim në variablat e zakonshme group_vars/all/vars të gjithë dëgjuesit, dhe të shtojmë në emër emrin e grupit:
# group_vars/all/vars
bbauth_auth_bind_port: "20000"
ghauth_auth_bind_port: "30000"
# group_vars/bbauth/vars
auth_bind_port: "{{ bbauth_auth_bind_port }}"
# group_vars/ghauth/vars
auth_bind_port: "{{ ghauth_auth_bind_port }}"
# group_vars/myapi/vars
api_auth1_address: "http://{{ bbauth_auth_service_name }}:{{ bbauth_auth_bind_port }}"
api_auth2_address: "http://{{ ghauth_auth_service_name }}:{{ ghauth_auth_bind_port }}"Tani, duke ndryshuar vlerën e lidhësit, do të jemi të sigurt se kërkesa do t'i drejtohet aty ku është vendosur porta.
Stili i Kodit
- Pasi rolet dhe grupet janë objekte të ndryshme të sistemit, është e nevojshme që ato të kenë emra të ndryshëm, atëherë variablat e lidhjes do të tregojnë saktësisht se i përkasin një grupi të caktuar serverësh dhe jo një roli në sistem.
Skedarët e varur nga mjedisi
Në role mund të përdoren skedarë që dallojnë nga mjedisi në mjedis.
Një shembull i tillë i skedarëve mund të jenë certifikatat SSL. Të ruash ato në formë teksti
në një variablë nuk është shumë e përshtatshme. Por është më e lehtë të ruash rrugën deri te ato brenda variablës.
Për shembull, përdorim variablën api_ssl_key_file: "/path/to/file".
Pasi është e qartë se certifikata e çelësit do të ndryshojë nga mjedisi në mjedis, atëherë kjo është një variabël e varur nga mjedisi, prandaj ajo duhet të vendoset në skedarin
group_vars/myapi/vars inventory të variablave, dhe të përmbajë vlerën 'për shembull'.
Më e përshtatshme në këtë rast është ta vendosësh skedarin e çelësit në depot e playbook-ut në rrugën
files/prod/certs/myapi.key, atëherë vlera e variablës do të jetë:
api_ssl_key_file: "prod/certs/myapi.key". Përshtatshmëria qëndron se njerëzit që janë përgjegjës për vendosjen e sistemit në një skenë të caktuar gjithashtu kanë vendin e tyre të dedikuar në depot për ruajtjen e skedarëve të tyre. Në të njëjtën kohë, mbetet mundësia për të treguar rrugën absolute deri te certifikata në server, në rast se certifikatat ofrohen nga një sistem tjetër.
Disa skena në një mjedis
Ndonjëherë paraqitet nevoja për të shpërndarë disa ambiente praktikisht identike në një mjedis me ndryshime minimale. Në këtë rast, ne e ndajmë variablat e varur nga mjedisi në ata që nuk ndryshojnë brenda këtij mjedisi dhe ata që ndryshojnë. Dhe i nxjerrim të fundit direkt në skedat e inventarit. Pas kësaj manipulimi bëhet e mundur krijimi i një inventari tjetër pikërisht në katalogun e mjedisit.
Ai do ta rishfrytëzojë inventarin e group_vars, si dhe do të ketë mundësinë të ri-definojë disa variabla direkt sipas nevojës.
Struktura përfundimtare e katalogëve për projektin e shpërndarjes:
mydeploy # Katalogu i shpërndarjes
âââ deploy.yml # Plani i shpĂ«rndarjes
âââ files # Katalogu pĂ«r skedarĂ«t e shpĂ«rndarjes
â âââ prod # Katalogu pĂ«r skedarĂ«t varur nga mjedisi tĂ« prodhimit
â â âââ certs #
â â âââ myapi.key #
â âââ test1 # Katalogu pĂ«r skedarĂ«t varur nga mjedisi tĂ« test1
âââ group_vars # Katalogu i variablave tĂ« planit
â âââ all.yml # Skedari pĂ«r variablat e lidhjes sĂ« gjithĂ« sistemit
â âââ myapi.yml # Skedari i variablave tĂ« grupit myapi
â âââ bbauth.yml #
â âââ ghauth.yml #
âââ inventories #
âââ prod # Katalogu i mjedisit tĂ« prodhimit
â âââ group_vars # Katalogu pĂ«r variablat e inventarit
â â âââ myapi #
â â â âââ vars.yml # Variablat varur nga mjedisi tĂ« grupit myapi
â â â âââ vault.yml # Sekretet (pĂ«rherĂ« varur nga mjedisi)
â â âââ bbauth #
â â â âââ vars.yml #
â â â âââ vault.yml #
â â âââ ghauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ prod.ini # Inventari i mjedisit tĂ« prodhimit
âââ test # Katalogu i mjedisit tĂ« testit
âââ group_vars #
â âââ myapi #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ bbauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ ghauth #
â âââ vars.yml #
â âââ vault.yml #
âââ test1.ini # Inventari i mjedisit tĂ« test1 nĂ« mjedisin e testit
âââ test2.ini # Inventari i mjedisit tĂ« test2 nĂ« mjedisin e testitPĂ«rmbledhje
Pas organizimit të variablieve sipas artikullit: çdo skedar me variabla përmbush një detyrë të caktuar. Dhe pasi skedari ka detyra specifike, është bërë e mundur të emërohet një përgjegjës për saktësinë e çdo skedari. Për shembull, për saktësinë e plotësimit të variablave të playbook, përgjegjës bëhet zhvilluesi i sistemit të deploymentit, ndërsa për plotësimin e variablave të inventarit përgjegjësi është administratorin, i cili është përshkruar në inventar.
Rolat janë bërë një njësi e pavarur zhvillimi me një ndërfaqe më vete, çka i mundësoi zhvilluesit të rolit të zhvillojë mundësi, dhe jo të përshtat rolin sipas sistemit. Kjo problematike ishte veçanërisht e pranishme për rolet e përbashkëta për të gjitha sistemet në kompani.
Administratoret e sistemeve nuk kanë më nevojë të kuptojnë kodin e deploymentit. E vetmja gjë që kërkohet nga ata për një deployment të suksesshëm është plotësimi i skedareve me variabla të varur nga mjedisi.
Literatura
Autori
Kalyuzhny Denis Aleksandrovich
Burimi: habr.com
