SĂŒsteemne lĂ€henemine muutujatele Ansible'is

ansible devops koodistiil

Tere! Minu nimi on Denis KaljuĆŸnyj 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 BestPractices, 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.

SĂŒsteemne lĂ€henemine muutujatele Ansible'is

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?

SĂŒsteemne lĂ€henemine muutujatele Ansible'is

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: admin

    Siin 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) *

* — Muutujad ja seifid

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.

SĂŒsteemne lĂ€henemine muutujatele Ansible'is

Kujutage ette, millisena see mÀnguraamat vÀlja nÀeb:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Meil 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 idee 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:

SĂŒsteemne lĂ€henemine muutujatele Ansible'is

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 inventuur

KokkuvÔ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

  1. Dokumentatsioon

Timur Gilmullin

Denis Aleksandrovich Kalyuzhny

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster