Approċċ tas-sistema għall-varjabbli f'Ansible

ansible devops codestyle

Ħej! Jien jisimni Denis Kalyuzhny Naħdem bħala inġinier fid-dipartiment tal-awtomazzjoni tal-proċess tal-iżvilupp. Kull jum, bini ġdid ta' applikazzjonijiet jiġu mxerrda fuq mijiet ta' servers tal-kampanja. U f'dan l-artikolu naqsam l-esperjenza tiegħi ta 'l-użu ta' Ansible għal dawn l-għanijiet.

Din il-gwida toffri mod kif torganizza varjabbli fl-iskjerament. Din il-gwida hija maħsuba għal dawk li diġà jużaw ir-rwoli fil-playbooks tagħhom u li qraw L-Aħjar Prattiċi, iżda jiffaċċja problemi simili:

  • Wara li sabet varjabbli fil-kodiċi, huwa impossibbli li tifhem immedjatament għalxiex hija responsabbli;
  • Hemm diversi rwoli, u l-varjabbli jeħtieġ li jkunu assoċjati ma 'valur wieħed, iżda sempliċement ma taħdimx;
  • Ikollok diffikultà biex tispjega lil oħrajn kif taħdem il-loġika tal-varjabbli fil-playbooks tiegħek

Iltqajna ma 'dawn il-problemi fuq proġetti fil-kumpanija tagħna, li b'riżultat ta' dawn wasalna għal regoli għat-tfassil ta 'varjabbli fil-playbooks tagħna, li sa ċertu punt solvew dawn il-problemi.

Approċċ tas-sistema għall-varjabbli f'Ansible

Varjabbli fir-rwoli

Rwol huwa Għan separat tas-sistema ta' skjerament. Bħal kull oġġett tas-sistema, għandu jkollu interface għall-interazzjoni mal-bqija tas-sistema. Tali interface huwa varjabbli tar-rwol.

Ejja nieħdu, pereżempju, ir-rwol api, li jinstalla applikazzjoni Java fuq is-server. Liema varjabbli jista' jkollha?

Approċċ tas-sistema għall-varjabbli f'Ansible

Rwoli varjabbli jistgħu jinqasmu f'2 tipi skond it-tip:

1. Свойства
    a) независимые от среды
    б) зависимые от среды
2. Связи
    a) слушатели 
    б) запросы внутри системы
    в) запросы в среду

Proprjetajiet varjabbli huma varjabbli li jiddeterminaw l-imġieba ta’ rwol.

Mistoqsija Varjabbli - dawn huma varjabbli li l-valur tagħhom jintuża biex jinnominaw riżorsi esterni għar-rwol.

semmiegħa varjabbli - dawn huma varjabbli li l-valur tagħhom jintuża biex jiffurmaw varjabbli ta' talba.

Min-naħa l-oħra, 1a, 2a, 2b huma varjabbli li ma jiddependux fuq l-ambjent (ħardwer, riżorsi esterni, eċċ.) u jistgħu jimtlew b'valuri awtomatiċi fir-rwol tal-inadempjenzi. Madankollu, huwa impossibbli li timla varjabbli tat-tip 1.b u 2.c b'valuri oħra għajr "eżempju", peress li se jinbidlu minn stand għal stand skont l-ambjent.

Stil tal-kodiċi

  • L-isem varjabbli għandu jibda bl-isem tar-rwol. Dan jagħmilha faċli li fil-futur insemmu minn liema rwol hi l-varjabbli u għal xiex hija responsabbli.
  • Meta tuża varjabbli fir-rwoli, trid tkun żgur li ssegwi l-prinċipju ta 'inkapsulament u tuża varjabbli definiti jew fir-rwol innifsu jew fir-rwoli li fuqhom jiddependi dak attwali.
  • Evita li tuża dizzjunarji għall-varjabbli. Ansible ma jippermettix li tegħleb b'mod konvenjenti valuri individwali f'dizzjunarju.

    Eżempju ta' varjabbli ħażina:

    myrole_user:
        login: admin
        password: admin

    Hawnhekk il-login hija l-varjabbli indipendenti, u l-password hija l-varjabbli dipendenti. Iżda
    peress li huma magħquda f'dizzjunarju, inti jkollok tispeċifika kompletament
    Dejjem. Li huwa inkonvenjenti ħafna. Aħjar b'dan il-mod:

    myrole_user_login: admin
    myrole_user_password: admin

Varjabbli fil-playbooks tal-iskjerament

Meta nikkompilaw playbook tal-iskjerament (minn hawn 'il quddiem imsejjaħ il-playbook), aħna nżommu mar-regola li għandu jitqiegħed f'repożitorju separat. L-istess bħar-rwoli: kull wieħed fir-repożitorju git tiegħu stess. Dan jippermettilek tifhem li r-rwoli u l-playbook huma oġġetti indipendenti differenti tas-sistema ta 'skjerament, u l-bidliet f'oġġett wieħed m'għandhomx jaffettwaw l-operat tal-ieħor. Dan jinkiseb billi jinbidlu l-valuri awtomatiċi tal-varjabbli.

Meta tikkompila playbook, biex tiġbor fil-qosor, huwa possibbli li jingħelbu l-valuri awtomatiċi tal-varjabbli tar-rwol f'żewġ postijiet: fil-varjabbli tal-playbook u fil-varjabbli tal-inventarju.

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   └── myapi.yml               # Файл переменных свойств группы myapi
└── inventories                 #
    └── prod                    # Каталог окружения prod
        ├── prod.ini            # Инвентори файл
        └── group_vars          # Каталог для переменных инвентори
            └── myapi           #
                ├── vars.yml    # Средозависимые переменные группы myapi
                └── vault.yml   # Секреты (всегда средозависимы) *

* - Varjabbli u Vaults

Id-differenza hija li l-varjabbli tal-playbook dejjem jintużaw meta ssejjaħ playbooks li jinsabu fl-istess livell bħalu. Dan ifisser li dawn il-varjabbli huma tajbin biex jibdlu l-valuri awtomatiċi ta 'varjabbli indipendenti mill-ambjent. Bil-maqlub, il-varjabbli tal-inventarju se jintużaw biss għal ambjent speċifiku, li huwa ideali għal varjabbli speċifiċi għall-ambjent.

Huwa importanti li wieħed jinnota li l-prijorità varjabbli ma tippermettix li tegħleb varjabbli l-ewwel fil-varjabbli tal-playbook u mbagħad separatament f'inventarju wieħed.

Dan ifisser li diġà f'dan l-istadju huwa meħtieġ li jiġi deċiż jekk il-varjabbli tiddependix mill-ambjent jew le u poġġiha fil-post xieraq.

Pereżempju, fi proġett wieħed, il-varjabbli responsabbli għall-abilitazzjoni tal-SSL kienet dipendenti fuq l-ambjent għal żmien twil, peress li ma stajniex nippermettu SSL għal raġunijiet lil hinn mill-kontroll tagħna f'wieħed mill-istands. Wara li rranġajna din il-problema, saret indipendenti mill-ambjent u mxiet għal varjabbli tal-playbook.

Varjabbli tal-Proprjetà għal Gruppi

Ejja nespandu l-mudell tagħna fil-Figura 1 billi nżidu 2 gruppi ta 'servers b'applikazzjoni Java differenti, iżda b'settings differenti.

Approċċ tas-sistema għall-varjabbli f'Ansible

Ejja nimmaġinaw kif se tidher il-playbook f'dan il-każ:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Għandna tliet gruppi fil-playbook, għalhekk huwa immedjatament rakkomandat li jinħoloq l-istess numru ta 'fajls tal-grupp fil-varjabbli tal-inventarju group_vars u l-varjabbli tal-playbook. Fajl tal-grupp wieħed f'dan il-każ huwa deskrizzjoni ta 'komponent wieħed tal-applikazzjoni ta' hawn fuq fil-playbook. Meta tiftaħ fajl tal-grupp fil-varjabbli tal-playbook, immedjatament tara d-differenzi kollha mill-imġiba default tar-rwoli installati fuq il-grupp. Fil-varjabbli tal-inventarju: differenzi fl-imġieba tal-grupp minn stand għal stand.

Stil tal-Kodiċi

  • Ipprova ma tużax host_vars varjabbli xejn, peress li ma jiddeskrivux is-sistema, iżda biss każ speċjali, li fil-futur se jwassal għal mistoqsijiet: "Għaliex dan il-host differenti mill-oħrajn?", ir-risposta għaliha mhix dejjem faċli li ssib.

Varjabbli tal-Komunikazzjoni

Madankollu, dak hu li l-varjabbli tal-proprjetà huma kollha dwar, imma xi ngħidu dwar il-varjabbli tal-komunikazzjoni?
Id-differenza tagħhom hija li għandhom ikollhom l-istess tifsira fi gruppi differenti.

Għall-ewwel kien idea uża kostruzzjoni mostruża bħal:
hostvars[groups['bbauth'][0]]['auth_bind_port'], iżda immedjatament irrifjutawha
għax għandha żvantaġġi. L-ewwelnett, bulkiness. It-tieni, dipendenza fuq ospitanti speċifiċi fil-grupp. It-tielet nett, qabel ma tibda l-iskjerament, huwa meħtieġ li niġbru fatti mill-hosts kollha jekk ma rridux niksbu żball ta 'varjabbli mhux definit.

Bħala riżultat, ġie deċiż li jintużaw varjabbli ta 'komunikazzjoni.

Varjabbli tal-Komunikazzjoni - dawn huma varjabbli li jappartjenu għall-playbook u huma meħtieġa biex jgħaqqdu l-oġġetti tas-sistema.

Il-varjabbli tal-komunikazzjoni huma popolati f'varjabbli ġenerali tas-sistema group_vars/all/vars u huma ffurmati billi jitneħħew il-varjabbli kollha tas-semmiegħa minn kull grupp, u żżid l-isem tal-grupp li minnu tneħħa s-semmiegħ fil-bidu tal-varjabbli.

Dan jiżgura l-uniformità u n-nuqqas ta' sovrapożizzjoni tal-ismijiet.

Ejja nippruvaw norbtu l-varjabbli mill-eżempju ta 'hawn fuq:

Approċċ tas-sistema għall-varjabbli f'Ansible

Ejja nimmaġinaw li għandna varjabbli li jiddependu minn xulxin:

# roles/api/defaults:
# Переменная запроса
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# Переменная слушатель
auth_bind_port: "20000"

Ejja npoġġuha f'varjabbli komuni group_vars/all/vars is-semmiegħa kollha, u żid l-isem tal-grupp mat-titlu:

# 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 }}"

Issa, billi nibdlu l-valur tal-konnettur, inkunu żguri li t-talba tmur fl-istess post fejn jinsab il-port.

Stil tal-Kodiċi

  • Peress li r-rwoli u l-gruppi huma oġġetti ta 'sistema differenti, jeħtieġ li jkollhom ismijiet differenti, allura l-varjabbli tal-link se jindikaw b'mod preċiż li jappartjenu għal grupp speċifiku ta' servers, u mhux għal rwol fis-sistema.

Fajls li jiddependu mill-ambjent

Ir-rwoli jistgħu jużaw fajls li jvarjaw minn ambjent għal ambjent.

Eżempju ta' fajls bħal dawn huma ċertifikati SSL. Aħżenhom f'forma ta' test
fi varjabbli mhuwiex konvenjenti ħafna. Iżda huwa konvenjenti li taħżen it-triq għalihom ġewwa varjabbli.

Pereżempju, nużaw il-varjabbli api_ssl_key_file: "/path/to/file".

Peress li huwa ovvju li ċ-ċertifikat ewlieni se jinbidel minn ambjent għal ambjent, din hija varjabbli li tiddependi mill-ambjent, li jfisser li għandha tkun tinsab fil-fajl
group_vars/myapi/vars inventarju ta' varjabbli, u jkun fihom il-valur 'per eżempju'.

L-aktar mod konvenjenti f'dan il-każ huwa li tpoġġi l-fajl ewlieni fir-repożitorju tal-playbook tul il-mogħdija
files/prod/certs/myapi.key, allura l-valur tal-varjabbli jkun:
api_ssl_key_file: "prod/certs/myapi.key". Il-konvenjenza tinsab fil-fatt li n-nies responsabbli għall-iskjerament tas-sistema fi stand speċifiku għandhom ukoll l-ispazju ddedikat tagħhom stess fir-repożitorju biex jaħżnu l-fajls tagħhom. Fl-istess ħin, jibqa 'possibbli li tiġi speċifikata l-mogħdija assoluta għaċ-ċertifikat fuq is-server, f'każ li ċ-ċertifikati jiġu forniti minn sistema oħra.

Stands multipli f'ambjent wieħed

Ħafna drabi jkun hemm bżonn li jiġu skjerati diversi stands kważi identiċi fl-istess ambjent b'differenzi minimi. F'dan il-każ, naqsmu varjabbli dipendenti mill-ambjent f'dawk li ma jinbidlux f'dan l-ambjent u dawk li jinbidlu. U aħna nittrasferixxu dawn tal-aħħar direttament fil-fajls tal-inventarju nfushom. Wara din il-manipulazzjoni, isir possibbli li jinħoloq inventarju ieħor direttament fid-direttorju tal-ambjent.

Se jerġa' juża l-inventarju group_vars, u jkun jista' wkoll jiddefinixxi mill-ġdid xi varjabbli direttament għalih innifsu.

L-istruttura tad-direttorju finali għall-proġett ta' skjerament:

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── files                       # Каталог для файлов деплоя
│   ├── prod                    # Католог для средозависимых файлов стенда prod
│   │   └── certs               # 
│   │       └── myapi.key       #
│   └── test1                   # Каталог для средозависимых файлов стенда test1
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   ├── myapi.yml               # Файл переменных свойств группы myapi
│   ├── bbauth.yml              # 
│   └── ghauth.yml              #
└── inventories                 #
    ├── prod                    # Каталог окружения prod
    │   ├── group_vars          # Каталог для переменных инвентори
    │   │   ├── myapi           #
    │   │   │   ├── vars.yml    # Средозависимые переменные группы myapi
    │   │   │   └── vault.yml   # Секреты (всегда средозависимы)
    │   │   ├── bbauth          # 
    │   │   │   ├── vars.yml    #
    │   │   │   └── vault.yml   #
    │   │   └── ghauth          #
    │   │       ├── vars.yml    #
    │   │       └── vault.yml   #
    │   └── prod.ini            # Инвентори стенда prod
    └── test                    # Каталог окружения test
        ├── group_vars          #
        │   ├── myapi           #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   ├── bbauth          #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   └── ghauth          #
        │       ├── vars.yml    #
        │       └── vault.yml   #
        ├── test1.ini           # Инвентори стенда test1 в среде test
        └── test2.ini           # Инвентори стенда test2 в среде test

Fil-qosor

Wara li torganizza l-varjabbli skont l-artikolu: kull fajl varjabbli huwa responsabbli għal kompitu speċifiku. U peress li l-fajl għandu ċerti kompiti, sar possibbli li jiġi assenjat lil xi ħadd responsabbli għall-korrettezza ta 'kull fajl. Pereżempju, l-iżviluppatur tal-iskjerament tas-sistema jsir responsabbli għall-mili korrett tal-varjabbli tal-playbook, filwaqt li l-amministratur li l-istand tiegħu huwa deskritt fl-inventarju huwa direttament responsabbli biex jimla l-inventarju tal-varjabbli.

Ir-rwoli saru l-unità ta 'żvilupp tagħhom stess bl-interface tagħhom stess, li jippermettu lill-iżviluppatur tar-rwoli jiżviluppa kapaċitajiet aktar milli jfassal ir-rwol għas-sistema. Din il-problema kienet tikkonċerna b'mod speċjali r-rwoli komuni għas-sistemi kollha fil-kampanja.

L-amministraturi tas-sistema m'għadx għandhom bżonn jifhmu l-kodiċi tal-iskjerament. Dak kollu li huwa meħtieġ minnhom għall-iskjerament b'suċċess huwa li jimlew il-fajls ta 'varjabbli li jiddependu mill-ambjent.

Letteratura

  1. Dokumentazzjoni

Awtur

Kalyuzhny Denis Alexandrovich

Sors: www.habr.com

Żid kumment