ansible devops koodistiil
Tere! Minu nimi on ma töötan arendusprotsesside automatiseerimise insenerina. Iga pÀev saadetavad uued rakenduste versioonid sadu servereid. Selles artiklis jagan oma kogemusi Ansible'i kasutamisel nende eesmÀrkide saavutamiseks.
See juhend pakub meetodit muutuja korraldamiseks juurutamises. Juhend on suunatud neile, kes juba kasutavad rolle oma mÀngukeeltes ja on lugenud , kuid kohtavad selliseid probleeme:
- Muutuja leidmine koodist ei vÔimalda kohe aru saada, mille eest see vastutab;
- On mitu rolli ja muutujad peavad olema seotud ĂŒhe vÀÀrtusega, kuid see ei Ă”nnestu;
- Tekivad raskused teistele seletamisel, kuidas on muutuja loogika teie mÀngukeeltes korraldatud.
Selle probleemiga oleme kokku puutunud meie ettevÔtte projektides, mille tÔttu oleme vÀlja töötanud reeglid muutuja vormistamiseks meie mÀngukeeltes, mis mingil mÀÀral lahendasid need probleemid.

Muutujad rollides
Roll on eraldi objekti juurutamise sĂŒsteemis. Nagu iga sĂŒsteemi objekt, peab ka sellel olema liidese funktsioon ĂŒlejÀÀnud sĂŒsteemiga suhtlemiseks. Selleks liideseks on rolli muutujad.
VÔtame nÀiteks rolli api, mis installib Java rakenduse serverisse. Millised on selle muutujad?

Rolli muutujad saab jagada kaheks tĂŒĂŒbiks:
1. Atribuudid
a) keskkonnast sÔltumatud
b) keskkonnast sÔltuvad
2. Seosed
a) kuulajad
b) sĂŒsteemi sisesed pĂ€ringud
c) keskkonna pÀringud
Atribuutide muutujad â need on muutujad, mis mÀÀratlevad rolli kĂ€itumise.
PĂ€ringu muutujad â need on muutujad, mille vÀÀrtust kasutatakse vĂ€liste ressursside tĂ€histamiseks, mis on rollist eraldi.
Kuulaja muutujad â need on muutujad, mille vÀÀrtust kasutatakse pĂ€ringu muutujate moodustamiseks.
Teisest kĂŒljest, 1a, 2a, 2b â need on muutujad, mis ei sĂ”ltu keskkonnast (riistvara, vĂ€lised ressursid jne) ja vĂ”ivad olla tĂ€idetud vaikimisi vÀÀrtustega rolli defaults. Siiski ei saa 1.b ja 2.c tĂŒĂŒpi muutujaid tĂ€ita muude vÀÀrtustega, kui 'example', kuna need muutuvad stendide kaupa sĂ”ltuvalt keskkonnast.
Koodistiil
- Muutuja nimi peab kindlasti algama rolli nimega. See vÔimaldab hiljem kergesti aru saada, millisest rollist muutuja pÀrineb ja mille eest ta vastutab.
- Muutujate kasutamisel rollides peate rangelt jÀrgima kapseldamise printsiipi ja kasutama muutujaid, mis on mÀÀratud kas rollis endas vÔi rollides, millest praegune sÔltub.
PĂŒĂŒdke mitte kasutada sĂ”nastikke muutujaid jaoks. Ansible ei vĂ”imalda mugavalt ĂŒle mÀÀrata ĂŒksikute vÀÀrtuste sĂ”nastikus.
Halva muutuja nÀide:
myrole_user: login: admin password: adminSiin on login keskkondade vahel sÔltumatu muutuja, samas kui password on sÔltuv. Kuid
kuna need on ĂŒhendatud sĂ”naraamatusse, peate seda alati tĂ€ielikult seadma
mis on vÀga ebamugav. Paremini nii:myrole_user_login: admin myrole_user_password: admin
Muutujad juurutuspleibookides
Juurutuspleibooki koostamisel (edaspidi pleibook) jĂ€rgime reeglit, et see peab asuma eraldi hoidlas. Nagu ka rollid: igaĂŒht oma git hoidlasse. See aitab mĂ”ista, et rollid ja pleibook on erinevad sĂ”ltumatud juurutussĂŒsteemi objektid ning muudatused ĂŒhes objektis ei tohiks mĂ”jutada teise tööd. Seda saavutatakse muutuja vaikesĂ€tete muutmisega.
Playbook'i koostamisel on vĂ”imalik ĂŒmbersuunata rolli muutujate vaikeseaded kahes kohas: playbook'i muutujates ja inventuuri muutujates.
mydeploy # Rakenduse kataloog
âââ deploy.yml # Rakenduse playbook
âââ group_vars # Playbook'i muutujate kataloog
â  âââ all.yml # Fail kogu sĂŒsteemi muutujate jaoks
â  âââ myapi.yml # Grupi myapi muutujate fail
âââ inventories #
âââ prod # Prod keskkonna kataloog
  âââ prod.ini # Inventuuri fail
  âââ group_vars # Inventuuri muutujate kataloog
    âââ myapi #
      âââ vars.yml # Grupi myapi keskkondade muutujad
      âââ vault.yml # Salajased andmed (alati keskkondade pĂ”hised) ** â
Erinevus seisneb selles, et mÀnguplaadi muutujad kasutatakse alati koos samal tasemel olevate mÀnguplaatidega. See tÀhendab, et need muutujad sobivad suurepÀraselt vaikevÀÀrtuste muutmiseks, mis ei sÔltu keskkonnast. Vastupidi, inventari muutujad kasutatakse ainult konkreetse keskkonna jaoks, mis on ideaalne keskkonnast sÔltuvate muutujate jaoks.
Oluline on mÀrkida, et muutujate prioriteet ei luba teil eelnevalt uue vÀÀrtuse mÀÀrata mÀnguplaadi muutujates ning seejÀrel eraldi inventaris.
See tÀhendab, et juba selles etapis tuleb otsustada, kas muutuja on keskkonnast sÔltuv vÔi mitte, ning paigutada see Ôigesse kohta.
NĂ€iteks ĂŒhes projektis oli muutujal, mis vastutas SSL-i aktiveerimise eest, pikka aega keskkonnast sĂ”ltuvus, kuna me ei saanud SSL-i aktiveerida meie kontrolli alt vĂ€liste tegurite tĂ”ttu ĂŒhel platvormil. PĂ€rast selle probleemi lahendamist muutus see keskkonnast sĂ”ltumatuks ja viidi mĂ€nguplaadi muutujate alla.
RĂŒhmade omaduste muutujad
Kavandame oma mudelit joonisel 1, lisades 2 serverigruppi erineva Java rakendusega, kuid erinevate seadistustega.

Kujutage ette, millisena see mÀnguraamat vÀlja nÀeb:
- hosts: myapi
roles:
- api
- hosts: bbauth
roles:
- auth
- hosts: ghauth
roles:
- authMeil on mĂ€nguraamatus kolm rĂŒhma, seega on soovitatav luua kohe sama palju grupifaile group_vars'i inventari muutujate ja mĂ€nguraamatu muutujate jaoks. Ăks grupifail on antud juhul ĂŒhe koostisosa kirjeldus, mis asub mĂ€nguraamatus. Avades grupifaili mĂ€nguraamatu muutujates, nĂ€ete kohe kĂ”iki erinevusi vaikimisi kĂ€itumisest, mis on mÀÀratud rĂŒhmale. Inventari muutujates: rĂŒhma kĂ€itumise erinevused seadmest seadmesse.
Koodistiil
- PĂŒĂŒdke vĂ€ltida host_vars muutujaid, kuna need ei kirjelda sĂŒsteemi, vaid ainult erijuhtu, mis vĂ”ib tulevikus tekitada kĂŒsimusi: "Miks see host erineb teistest?" Vastus sellele ei pruugi alati kergesti leida.
Seose muutujad
Kuid kuidas on seose muutujatega?
Nende erinevus seisneb selles, et need peavad olema erinevates rĂŒhmades sama vÀÀrtusega.
Alguses oli kasutada monstroosse konstruktsiooni, nagu:
hostvars[groups['bbauth'][0]]['auth_bind_port'], kuid sellest loobuti kohe.
kuna sellel on puudusi. Esiteks, mahukus. Teiseks, sÔltuvus kindlast hostist grupis. Kolmandaks, enne juurutamise algust tuleb koguda faktid kÔigilt hostidelt, kui me ei soovi mÀÀramatute muutujate viga.
KokkuvĂ”ttes otsustati kasutada ĂŒhendusmuutujaid.
Seose muutujad â need on muutujad, mis kuuluvad mĂ€nguraamatusse ja on vajalikud sĂŒsteemi objektide ĂŒhendamiseks.
Ăhendusmuutujad tĂ€idetakse sĂŒsteemi ĂŒldistes muutujates group_vars/all/vars ja need moodustatakse, viies kĂ”igi kuulajate muutujad iga grupist ning lisades muutuja algusesse grupi nime, kust kuulaja on vĂ€lja viidud.
Nii tagatakse nimede jĂ€rjepidevus ja ĂŒlekattumatuse.
Proovime seostada muutujaid eespool toodud nÀitest:

Kujutame ette, et meil on muutujad, mis ĂŒksteisest sĂ”ltuvad:
# roles/api/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń Đ·Đ°ĐżŃĐŸŃа
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"
# roles/auth/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń ŃĐ»ŃŃаŃДлŃ
auth_bind_port: "20000"Viime kĂ”ik kuulajad ĂŒldistesse muutujatesse group_vars/all/vars ja lisame pealkirjaks grupi nime:
# 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 }}"NĂŒĂŒd, muutes konnektori vÀÀrtust, oleme kindlad, et pĂ€ring suunatakse sinna, kus port asub.
Koodistiil
- Kuna rollid ja grupid on sĂŒsteemi erinevad objektid, peavad neil olema erinevad nimetused, et siduvad muutujad nĂ€itaksid selgelt, et need kuuluvad konkreetsele serverigrupile, mitte sĂŒsteemi rollile.
Keskkonnast sÔltuvad failid
Rollides vÔivad kasutada faile, mis erinevad keskkonnast keskkonda.
Selliste failide nÀiteks on SSL-sertifikaadid. Nende salvestamine tekstivormingus
muutuja sees ei ole vĂ€ga mugav. KĂŒll aga on mugav hoida nende teed muutuja sees.
NĂ€iteks kasutame muutujat api_ssl_key_file: "/path/to/file".
Kuna on ilmne, et vÔtme sertifikaat muutub keskkonnast keskkonda, siis on see keskkonnast sÔltuv muutuja ja seega peab see asuma failis
group_vars/myapi/vars muutujate inventuuris ning sisaldama vÀÀrtust 'nÀiteks'.
Selles olukorras on kÔige mugavam paigutada vÔtmefail mÀnguplaani reposse teele
files/prod/certs/myapi.key, siis on muutujate vÀÀrtus:
api_ssl_key_file: "prod/certs/myapi.key". Mugavus seisneb selles, et inimesed, kes vastutavad sĂŒsteemi kĂ€itamise eest konkreetse stendi peal, omavad samas oma eraldi kohta reposis, kus hoida oma faile. Samal ajal jÀÀb vĂ”imalus nĂ€idata absoluutset teed sertifikaadini serveris, juhul kui sertifikaate tarnib teine sĂŒsteem.
Mitu stendi ĂŒhes keskkonnas
Sageli on vaja kĂ€itada mitu praktiliselt identset stendi ĂŒhes keskkonnas minimaalsete erinevustega. Sel juhul jagame keskkonna sĂ”ltuvad muutujad nende vahel, mis ei muutu selles keskkonnas, ja nende vahel, mis muutuvad. Viime viimased otse inventari failidesse. PĂ€rast seda manipuleerimist on vĂ”imalik luua veel ĂŒks inventar otse keskkonna kataloogis.
See taaskasutab inventari group_vars ja vĂ”imaldab ka mĂ”ningate muutujate otse enda vajadustele vastavaks ĂŒle defineerida.
KÀitusprojekti lÔplik kataloogistruktuur:
mydeploy # Deploy kataloog
âââ deploy.yml # Deploy playbook
âââ files # Failide kataloog deploy'tamiseks
â âââ prod # Prod keskkonna sĂ”ltuvate failide kataloog
â â âââ certs #
â â âââ myapi.key #
â âââ test1 # Test1 keskkonna sĂ”ltuvate failide kataloog
âââ group_vars # Playbook'i muutujate kataloog
â âââ all.yml # Fail sĂŒsteemi kĂ”igi muutujate jaoks
â âââ myapi.yml # Myapi grupi omaduste muutujate fail
â âââ bbauth.yml #
â âââ ghauth.yml #
âââ inventories #
âââ prod # Prod keskkonna kataloog
â âââ group_vars # Inventari muutujate kataloog
â â âââ myapi #
â â â âââ vars.yml # Myapi gruppi sĂ”ltuvad muutujad
â â â âââ vault.yml # Saladused (alati sĂ”ltuvad)
â â âââ bbauth #
â â â âââ vars.yml #
â â â âââ vault.yml #
â â âââ ghauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ prod.ini # Prod keskkonna inventuur
âââ test # Test keskkonna kataloog
âââ group_vars #
â âââ myapi #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ bbauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ ghauth #
â âââ vars.yml #
â âââ vault.yml #
âââ test1.ini # Test1 keskkonna inventuur
âââ test2.ini # Test2 keskkonna inventuurKokkuvĂ”te
PĂ€rast muutujate korraldamist vastavalt artiklile: iga muutuja fail vastutab kindla ĂŒlesande eest. Kuna failil on kindlad ĂŒlesanded, on vĂ”imalik mÀÀrata vastutav isik iga faili Ă”igsuse eest. NĂ€iteks vastutab rollitegevuse tĂ€itmise eest sĂŒsteemi juurutamise arendaja, samas kui inventari muutujate tĂ€itmise eest vastutab otse administraator, kelle seade on inventaris kirjeldatud.
Rolledest on saanud iseseisev arendusĂŒksus oma kasutajaliidese ja funktsioonide arendamise vĂ”imalustega, mitte pole enam vaja rolli kohandada sĂŒsteemi. See probleem puudutas eriti kĂ”iki sĂŒsteemide ĂŒhiseid rolle ettevĂ”ttes.
SĂŒsteemi administraatorid ei pea enam arutama juurutamise koodi. KĂ”ik, mida nad vajavad eduka juurutamise jaoks, on keskkonnale sĂ”ltuvate muutujate failide tĂ€itmine.
Kirjandus
Timur Gilmullin
Denis Aleksandrovich Kalyuzhny
Allikas: habr.com
