ansible devops koodistiil
Tere! Minu nimi on ma töötan insenerina arenduse automatiseerimise osakonnas. Iga pÀev installitakse uusi rakenduste kogumeid sadu ettevÔtte servereid. Ja selles artiklis jagan ma oma kogemusi Ansible'i kasutamisel nende eesmÀrkide nimel.
See juhend pakub meetodit muutujate korraldamiseks juurutamises. Juhend on mÔeldud neile, kes juba kasutavad rolle oma mÀngudes ja on lugenud , kuid seisavad silmitsi jÀrgmiste probleemidega:
- Muuta muutuja leidmine koodis ei anna kohe arusaama, mille eest see vastutab;
- On mitu rolli ja muutujaid tuleb siduda ĂŒhe vÀÀrtusega, kuid see ei Ă”nnestu;
- Tekivad raskused selgitamisel teistele, kuidas teie mÀngudes muutujate loogika toimib.
Nende probleemidega oleme kokku puutunud meie ettevÔtte projektides, mille tulemusena oleme vÀlja töötanud reeglid muutujate vormistamiseks meie mÀngudes, mis mingil mÀÀral on need probleemid lahendanud.

Muudatused mÀngudes
Roll on eraldi juurutussĂŒsteemi objekt. Nagu iga sĂŒsteemi objekt, peab tal olema suhtlemise liides ĂŒlejÀÀnud sĂŒsteemiga. Selliseks liideseks on rolli muutujad.
VÔtame nÀiteks rolli api, mis installib Java rakenduse serverisse. Millised muutujad vÔivad sellel olla?

Rooli muutujaid saab jagada kaheks tĂŒĂŒbiks:
1. Atribuudid
a) sÔltumatud keskkonnast
b) sÔltuvad keskkonnast
2. Seosed
a) kuulajad
b) pĂ€ringud sĂŒsteemis
c) pÀringud keskkonda
Muutujate atribuudid â need on muutujad, mis mÀÀratlevad rolli kĂ€itumise.
Muutujad â need on muutujad, mille vÀÀrtust kasutatakse vĂ€liste, rolliga seotud ressursside mÀÀratlemiseks.
Kuulajate muutujad â need on muutujad, mille vÀÀrtust kasutatakse pĂ€ringute muutujate moodustamiseks.
Teisest kĂŒljest, 1a, 2a, 2b â need on muutujad, mis ei sĂ”ltu keskkonnast (riistvara, vĂ€lised ressursid jne) ja neid saab tĂ€ita vaikimisi vÀÀrtustega rolli defaults. Siiski, muutujaid tĂŒĂŒpi 1b ja 2c ei saa tĂ€ita muude vÀÀrtustega kui 'example', kuna need muutuvad sĂ”ltuvalt keskkonnast.
Koodistiil
- Muutuja nimi peab algama rolli nimetusega. See aitab hiljem hÔlpsasti mÔista, millisest rollist muutuja pÀrineb ja mille eest see vastutab.
- Rolleides kasutamisel peate kindlasti jÀrgima kapseldamise pÔhimÔtet ja kasutama muutujaid, mis on mÀÀratletud kas rollis endas vÔi rollides, millest praegune sÔltub.
PĂŒĂŒdke mitte kasutada sĂ”nastikke muutujaid. Ansible ei vĂ”imalda mugavalt eraldi vÀÀrtuste ĂŒlekirjutamist sĂ”nastikus.
Halva muutuja nÀide:
myrole_user: login: admin password: adminSiin on login keskkonna sÔltumatu muutuja, kuid password on sÔltuv. Kuid
kuna nad on ĂŒhendatud sĂ”nastikku, peate selle alati tĂ€ielikult mÀÀrama,
mis on vÀga ebamugav. Paremini nii:myrole_user_login: admin myrole_user_password: admin
Muudatused paigaldusplaanides
Paigaldusplaani koostamisel (edaspidi paigaldusplaan) jĂ€rgime reeglit, et see peaks olema paigutatud eraldi hoidlasse. Nii nagu rollid: igaĂŒks oma git-hoidlas. See vĂ”imaldab mĂ”ista, et rollid ja paigaldusplaan on erinevad sĂ”ltumatud objektid paigaldussĂŒsteemis ning ĂŒhe objekti muutused ei tohiks mĂ”jutada teise toimimist. Seda saavutatakse muutujaede vaikimisi vÀÀrtuste muutmisega.
Paigaldusplaani koostamisel, kui ĂŒldiselt kokku vĂ”tta, on vĂ”imalik ĂŒletada rolli muutujaede vaikimisi vÀÀrtusi kahes kohas: paigaldusplaani muutujaedes ja inventeerimise muutujaedes.
mydeploy # Paigalduskaust
âââ deploy.yml # Paigaldusplaan
âââ group_vars # Paigaldusplaani muutujaede kaust
â  âââ all.yml # Fail kogu sĂŒsteemi muutujaede jaoks
â  âââ myapi.yml # Grupi myapi omaduste muutujaede fail
âââ inventories #
âââ prod # Prod keskkonna kaust
  âââ prod.ini # Inventeerimise fail
  âââ group_vars # Inventeerimise muutujaede kaust
    âââ myapi #
      âââ vars.yml # Grupiga myapi keskkonna sĂ”ltumatud muutujaed
      âââ vault.yml # Saladused (alati keskkonna sĂ”ltuvad) ** â
Erinevus seisneb selles, et paigaldusplaani muutujaed kasutatakse alati, kui kutsutakse esile paigaldusplaanid, mis asuvad sellel tasemel. SeetÔttu sobivad need muutujaed suurepÀraselt keskkonnast sÔltumatute muutujaede vaikimisi vÀÀrtuste muutmiseks. Vastupidi, inventeerimise muutujaed kasutatakse ainult konkreetse keskkonna jaoks, mis on ideaalne keskkonnast sÔltuvate muutujaede jaoks.
Oluline on mĂ€rkida, et muutuja prioriteet ei luba teil algul ĂŒletada muutujaid mĂ€nguplaadis ning seejĂ€rel eraldi ĂŒhes inventuuris.
See tÀhendab, et juba sel etapil tuleb otsustada, kas muutuja sÔltub keskkonnast vÔi mitte, ning paigutada see Ôigesse kohta.
NĂ€iteks ĂŒhes projektis oli muutuja, mis vastutas SSL-i sisselĂŒlitamise eest, pikka aega keskkonnast sĂ”ltuv, kuna me ei saanud SSL-i sisselĂŒlitada meie kontrolli alt vĂ€ljas olevatel pĂ”hjustel ĂŒhes testkeskkonnas. PĂ€rast probleemi lahendamist muutus see keskkonnast sĂ”ltumatuks ja viidi mĂ€nguplaadi muutujate hulka.
RĂŒhma omaduste muutujad
Laiendame meie mudelit joonisel 1, lisades 2 serverigruppi teise Java rakendusega, kuid erinevate seadistustega.

Kujutame ette, kuidas mÀnguplaan sel juhul vÀlja nÀeb:
- hosts: myapi
roles:
- api
- hosts: bbauth
roles:
- auth
- hosts: ghauth
roles:
- authMeil on mĂ€nguplaanis kolm gruppi, seega on soovitatav kohe luua sama palju grupifaile group_vars muutujate inventuuris ja mĂ€nguplaanis. Ăks grupifail on sel juhul ĂŒhe teie rakenduse komponendi kirjelduseks mĂ€nguplaanis. Avades grupifaili muutujates, nĂ€ete kohe kĂ”iki erinevusi gruppi kehtestatud rollide vaikimisi kĂ€itumisest. Muutujate inventuuris: grupi kĂ€itumise erinevused seadmest seadmest.
Koodistiil
- PĂŒĂŒdke ĂŒldse mitte kasutada host_vars muutujaid, kuna need ei kirjelda sĂŒsteemi, vaid ainult erandjuhte, mis tulevikus toob kaasa kĂŒsimusi: "Miks see host erineb teistest?", millele vastuse leidmine ei ole alati kerge.
Sidusmuutujad
Kuid see puudutab omaduste muutujaid, kuid kuidas on sidusmuutujatega?
Nende eripÀra on see, et need peavad olema erinevates gruppides sama vÀÀrtusega.
Alguses oli kasutada monstrossset struktuuri nagu:
hostvars[groups['bbauth'][0]]['auth_bind_port'], kuid sellest loobuti kohe
sest sellel on puudused. Esiteks, mahukus. Teiseks, sÔltuvus teatud hostist grupis. Kolmandaks, enne juurutamise alustamist tuleb koguda faktid kÔigilt hostidelt, kui me ei taha saada mÀÀramata muutuja viga.
LÔppkokkuvÔttes otsustati kasutada sidusmuutujaid.
Sidusmuutujad â need to be variables that belong to the playbook and are required to link system objects.
Linking variables are filled in the system's common variables. group_vars/all/vars and are formed by extracting all listener variables from each group and adding the name of the group from which the listener was extracted to the beginning of the variable.
This ensures uniformity and non-overlapping names.
Let's try to link the variables from the example above:

Imagine we have variables that depend on each other:
# roles/api/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń Đ·Đ°ĐżŃĐŸŃа
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"
# roles/auth/defaults:
# ĐĐ”ŃĐ”ĐŒĐ”ĐœĐœĐ°Ń ŃĐ»ŃŃаŃДлŃ
auth_bind_port: "20000"We will extract all listeners into common variables group_vars/all/vars and add the group's name to the title:
# 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 }}"Now, by changing the value of the connector, we will be confident that the request will point to where the port is located.
Koodistiil
- Since roles and groups are different objects in the system, they need to have different names, then the linking variables will clearly show that they belong to a specific server group, not a role in the system.
Environment-dependent files
Files that may differ from environment to environment can be used in roles.
An example of such files can be SSL certificates. Storing them in text form
in a variable is not very convenient. However, it is convenient to store the path to them within the variable.
For example, we use the variable api_ssl_key_file: "/path/to/file".
Since it is obvious that the key certificate will change from environment to environment, this is an environment-dependent variable, and it should therefore be located in the file
group_vars/myapi/vars inventory of variables and contain the value 'for example'.
It is most convenient in this case to place the key file in the playbook repository at the path
files/prod/certs/myapi.key, then the value of the variable will be:
api_ssl_key_file: "prod/certs/myapi.key". The convenience here is that the people responsible for deploying the system on a specific stand also have their designated space in the repository for storing their files. At the same time, there remains the possibility to indicate the absolute path to the certificate on the server, in case the certificates are provided by another system.
Multiple stands in one environment
Tihtipeale on vaja juurutada mitmeid praktiliselt identsed keskkondi minimaalsed erinevused. Sellisel juhul jaotame keskkonnapĂ”hised muutujad nende vahel, mis ei muutu selle keskkonna piires ja nende vahel, mis muutuvad. Viime viimased otse inventarifailidesse. PĂ€rast seda manipuleerimist on vĂ”imalik luua veel ĂŒks inventar otse keskkonna kataloogis.
See kasutab uuesti inventarigrupi muutujaid ning tal on vĂ”imalus ĂŒletada mĂ”ned muutujad otse enda alla.
LÔplik kataloogistruktuur juurutusprojekti jaoks:
mydeploy # Juurutuskaust
âââ deploy.yml # Juurutuse mĂ€ngu fail
âââ files # Juurutuse failide kaust
â âââ prod # KeskkonnapĂ”histe failide kaust prod seismise jaoks
â â âââ certs #
â â âââ myapi.key #
â âââ test1 # KeskkonnapĂ”histe failide kaust test1 seismise jaoks
âââ group_vars # MĂ€ngu muutuja kaust
â âââ all.yml # Fail kogu sĂŒsteemi seotuse muutujate jaoks
â âââ myapi.yml # Fail myapi grupi omaduste muutujate jaoks
â âââ bbauth.yml #
â âââ ghauth.yml #
âââ inventories #
âââ prod # Prod keskkonna kaust
â âââ group_vars # Inventarimuutujate kaust
â â âââ myapi #
â â â âââ vars.yml # KeskkonnapĂ”hised myapi grupi muutujad
â â â âââ vault.yml # Salajased (alati keskkonnapĂ”hised)
â â âââ bbauth #
â â â âââ vars.yml #
â â â âââ vault.yml #
â â âââ ghauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ prod.ini # Prod seismise inventar
âââ test # Test keskkonna kaust
âââ group_vars #
â âââ myapi #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ bbauth #
â â âââ vars.yml #
â â âââ vault.yml #
â âââ ghauth #
â âââ vars.yml #
â âââ vault.yml #
âââ test1.ini # Testi olukorra test1 inventar
âââ test2.ini # Testi olukorra test2 inventarKokkuvĂ”te
PĂ€rast muutujate korraldamist artikli jĂ€rgi: iga muutujafail vastutab teatud ĂŒlesande eest. Kuna failil on kindlad ĂŒlesanded, on vĂ”imalik mÀÀrata vastutav isik iga faili Ă”igsuse eest. NĂ€iteks playbook'i muutujate Ă”iguse eest vastutab sĂŒsteemi deploy arendaja, samas kui inventari muutujate tĂ€itmise eest vastutab otseselt administraator, kelle stall on inventaris kirjas.
Rollidest said iseseisvad arenduse ĂŒksused oma liidesele, mis vĂ”imaldas rolli arendajal arendada vĂ”imalusi, mitte kohandada rolli sĂŒsteemi jĂ€rgi. See probleem puudutas eriti ĂŒldisi rolle kogu kampaania sĂŒsteemide jaoks.
SĂŒsteemi administraatorid ei pea enam aru saama deploy koodist. KĂ”ik, mida neilt nĂ”utakse eduka deploy jaoks, on tĂ€ita keskkondade sĂ”ltuvate muutujate failid.
Kirjandus
Autor
KaljuĆŸny Denis AleksandrovitĆĄ
Allikas: habr.com
