Mbinu ya mfumo kwa anuwai katika Ansible

ansible devops codestyle

Habari! Jina langu ni Denis Kalyuzhny Ninafanya kazi kama mhandisi katika idara ya otomatiki ya mchakato wa maendeleo. Kila siku, miundo mipya ya programu inatolewa kwenye mamia ya seva za kampeni. Na katika makala hii ninashiriki uzoefu wangu wa kutumia Ansible kwa madhumuni haya.

Mwongozo huu unatoa njia ya kupanga vigezo katika uwekaji. Mwongozo huu umekusudiwa wale ambao tayari wanatumia majukumu katika vitabu vyao vya michezo na wamesoma Mbinu Bora, lakini inakabiliwa na shida kama hizo:

  • Baada ya kupata kutofautisha katika nambari, haiwezekani kuelewa mara moja ni nini inawajibika;
  • Kuna majukumu kadhaa, na vigezo vinahitaji kuhusishwa na thamani moja, lakini haifanyi kazi;
  • Kuwa na ugumu wa kueleza wengine jinsi mantiki ya vigeu kwenye vitabu vyako vya kucheza hufanya kazi

Tulikumbana na matatizo haya kwenye miradi katika kampuni yetu, kwa sababu hiyo tulifikia sheria za kubuni vigeu kwenye vitabu vyetu vya kucheza, ambavyo kwa kiasi fulani vilitatua matatizo haya.

Mbinu ya mfumo kwa anuwai katika Ansible

Vigezo katika majukumu

Jukumu ni Kitu tofauti cha mfumo wa kupeleka. Kama kitu chochote cha mfumo, lazima iwe na kiolesura cha kuingiliana na mfumo wote. Kiolesura kama hicho ni vigezo vya jukumu.

Hebu tuchukue, kwa mfano, jukumu api, ambayo husakinisha programu ya Java kwenye seva. Je, inaweza kuwa na vigezo gani?

Mbinu ya mfumo kwa anuwai katika Ansible

Majukumu yanayobadilika yanaweza kugawanywa katika aina 2 kulingana na aina:

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

Tabia zinazobadilika ni vigezo vinavyoamua tabia ya jukumu.

Vigezo vya Maswali - hivi ni vigeu ambavyo thamani yake hutumika kuteua rasilimali nje ya jukumu.

Wasikilizaji wanaobadilika - hizi ni vigezo ambavyo thamani yake hutumiwa kuunda vigezo vya ombi.

Kwa upande mwingine, 1a, 2a, 2b ni anuwai ambazo hazitegemei mazingira (vifaa, rasilimali za nje, n.k.) na zinaweza kujazwa na maadili chaguo-msingi katika jukumu la chaguo-msingi. Hata hivyo, haiwezekani kujaza vigeu vya aina ya 1.b na 2.c na thamani tofauti na 'mfano', kwa kuwa vitabadilika kutoka kwa stendi hadi kusimama kulingana na mazingira.

Mtindo wa kanuni

  • Jina la kutofautisha lazima lianze na jina la jukumu. Hii itafanya iwe rahisi kujua katika siku zijazo ni jukumu gani la kutofautisha na linawajibika kwa nini.
  • Wakati wa kutumia vigezo katika majukumu, lazima uhakikishe kufuata kanuni ya encapsulation na kutumia vigezo vinavyoelezwa ama katika jukumu lenyewe au katika majukumu ambayo ya sasa inategemea.
  • Epuka kutumia kamusi kwa vigezo. Ansible haikuruhusu kubatilisha maadili mahususi kwa urahisi katika kamusi.

    Mfano wa tofauti mbaya:

    myrole_user:
        login: admin
        password: admin

    Hapa kuingia ni kigezo cha kujitegemea, na nenosiri ni tofauti tegemezi. Lakini
    kwa kuwa zimeunganishwa katika kamusi, itabidi uibainishe kabisa
    Kila mara. Ambayo ni usumbufu sana. Bora kwa njia hii:

    myrole_user_login: admin
    myrole_user_password: admin

Vigezo katika vitabu vya kucheza vya kusambaza

Wakati wa kuandaa kitabu cha michezo cha kusambaza (ambacho kitajulikana kama kitabu cha kucheza), tunazingatia sheria kwamba kinapaswa kuwekwa katika hazina tofauti. Sawa na majukumu: kila moja katika hazina yake ya git. Hii inakuwezesha kuelewa kwamba majukumu na kitabu cha kucheza ni vitu tofauti vya kujitegemea vya mfumo wa kupeleka, na mabadiliko katika kitu kimoja haipaswi kuathiri uendeshaji wa nyingine. Hii inafanikiwa kwa kubadilisha maadili ya msingi ya vigezo.

Wakati wa kuandaa kitabu cha kucheza, kwa muhtasari, inawezekana kubatilisha maadili chaguo-msingi ya vigeu vya jukumu katika sehemu mbili: katika vigeu vya kitabu cha kucheza na katika vigeu vya hesabu.

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

* - Vigezo na Vaults

Tofauti ni kwamba anuwai za kitabu cha kucheza hutumiwa kila wakati wakati wa kupiga vitabu vya kucheza vilivyo katika kiwango sawa na hicho. Hii inamaanisha kuwa anuwai hizi ni nzuri kwa kubadilisha maadili chaguo-msingi ya anuwai zinazojitegemea kwa mazingira. Kinyume chake, vigezo vya hesabu vitatumika tu kwa mazingira maalum, ambayo ni bora kwa vigezo maalum vya mazingira.

Ni muhimu kutambua kwamba kipaumbele cha kutofautiana hakitakuruhusu kubatilisha vigeu kwanza katika vigeu vya kitabu cha kucheza na kisha kando katika orodha moja.

Hii ina maana kwamba tayari katika hatua hii ni muhimu kuamua ikiwa kutofautiana kunategemea mazingira au la na kuiweka mahali pazuri.

Kwa mfano, katika mradi mmoja, kigezo chenye jukumu la kuwezesha SSL kilikuwa tegemezi kwa mazingira kwa muda mrefu, kwa kuwa hatukuweza kuwezesha SSL kwa sababu zilizo nje ya uwezo wetu katika mojawapo ya vituo. Baada ya kusuluhisha tatizo hili, ilijitegemea katika mazingira na kuhamia kwenye vibadala vya kitabu cha kucheza.

Vigezo vya Mali kwa Vikundi

Wacha tupanue kielelezo chetu kwenye Mchoro 1 kwa kuongeza vikundi 2 vya seva zilizo na programu tofauti ya Java, lakini kwa mipangilio tofauti.

Mbinu ya mfumo kwa anuwai katika Ansible

Wacha tufikirie jinsi kitabu cha kucheza kitaonekana katika kesi hii:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Tuna vikundi vitatu kwenye kitabu cha kucheza, kwa hivyo inashauriwa mara moja kuunda idadi sawa ya faili za kikundi katika vigeu vya hesabu vya group_vars na vigeu vya kitabu cha kucheza. Faili moja ya kikundi katika kesi hii ni maelezo ya sehemu moja ya programu iliyo hapo juu kwenye kitabu cha kucheza. Unapofungua faili ya kikundi katika vigezo vya kitabu cha kucheza, unaona mara moja tofauti zote kutoka kwa tabia chaguo-msingi ya majukumu yaliyosakinishwa kwenye kikundi. Katika vigezo vya hesabu: tofauti katika tabia ya kikundi kutoka kwa kusimama hadi kusimama.

Mtindo wa Kanuni

  • Jaribu kutotumia vigezo vya host_vars kabisa, kwa kuwa hazielezei mfumo, lakini kesi maalum tu, ambayo katika siku zijazo itasababisha maswali: "Kwa nini mwenyeji huyu ni tofauti na wengine?", Jibu ambalo sio. daima rahisi kupata.

Vigezo vya Mawasiliano

Walakini, ndivyo anuwai za mali zinahusu, lakini vipi kuhusu anuwai za mawasiliano?
Tofauti yao ni kwamba wanapaswa kuwa na maana sawa katika makundi mbalimbali.

Mara ya kwanza ilikuwa wazo tumia muundo wa kutisha kama vile:
hostvars[groups['bbauth'][0]]['auth_bind_port'], lakini mara moja waliikataa
kwa sababu ina hasara. Kwanza, wingi. Pili, utegemezi kwa mwenyeji maalum katika kikundi. Tatu, kabla ya kuanza kupeleka, ni muhimu kukusanya ukweli kutoka kwa wapangishi wote ikiwa hatutaki kupata hitilafu ya kigezo kisichobainishwa.

Matokeo yake, iliamuliwa kutumia vigezo vya mawasiliano.

Vigezo vya Mawasiliano - hivi ni vigeu ambavyo ni vya kitabu cha kucheza na vinahitajika ili kuunganisha vitu vya mfumo.

Vigezo vya mawasiliano vimejaa katika anuwai za mfumo wa jumla group_vars/all/vars na huundwa kwa kuondoa vigeuzo vyote vya wasikilizaji kutoka kwa kila kikundi, na kuongeza jina la kikundi ambacho msikilizaji aliondolewa hadi mwanzo wa kutofautisha.

Hii inahakikisha usawa na kutoingiliana kwa majina.

Wacha tujaribu kufunga vijiti kutoka kwa mfano hapo juu:

Mbinu ya mfumo kwa anuwai katika Ansible

Wacha tufikirie kuwa tunayo anuwai ambayo inategemea kila mmoja:

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

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

Hebu tuweke katika vigezo vya kawaida group_vars/all/vars wasikilizaji wote, na ongeza jina la kikundi kwenye kichwa:

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

Sasa, kwa kubadilisha thamani ya kontakt, tutakuwa na uhakika kwamba ombi litaenda mahali pale ambapo bandari iko.

Mtindo wa Kanuni

  • Kwa kuwa majukumu na vikundi ni vitu tofauti vya mfumo, wanahitaji kuwa na majina tofauti, basi vigezo vya kiungo vitaonyesha kwa usahihi kwamba wao ni wa kundi maalum la seva, na sio jukumu katika mfumo.

Faili zinazotegemea mazingira

Majukumu yanaweza kutumia faili ambazo hutofautiana kutoka kwa mazingira hadi mazingira.

Mfano wa faili kama hizo ni cheti cha SSL. Hifadhi kwa fomu ya maandishi
katika kutofautisha sio rahisi sana. Lakini ni rahisi kuhifadhi njia kwao ndani ya kutofautisha.

Kwa mfano, tunatumia kutofautiana api_ssl_key_file: "/path/to/file".

Kwa kuwa ni dhahiri kuwa cheti muhimu kitabadilika kutoka kwa mazingira hadi mazingira, hii ni tofauti inayotegemea mazingira, ambayo inamaanisha inapaswa kuwa kwenye faili.
group_vars/myapi/vars orodha ya vigeu, na vyenye thamani 'kwa mfano'.

Njia rahisi zaidi katika kesi hii ni kuweka faili muhimu kwenye hazina ya kitabu cha kucheza kando ya njia
files/prod/certs/myapi.key, basi thamani ya kutofautisha itakuwa:
api_ssl_key_file: "prod/certs/myapi.key". Urahisi upo katika ukweli kwamba watu wanaohusika na kupeleka mfumo kwenye stendi maalum pia wana nafasi yao ya kujitolea kwenye ghala ili kuhifadhi faili zao. Wakati huo huo, bado inawezekana kutaja njia kamili ya cheti kwenye seva, ikiwa vyeti vinatolewa na mfumo mwingine.

Viwanja vingi katika mazingira moja

Mara nyingi kuna haja ya kupeleka vituo kadhaa karibu kufanana katika mazingira sawa na tofauti ndogo. Katika kesi hii, tunagawanya vigeu vinavyotegemea mazingira katika vile ambavyo havibadiliki ndani ya mazingira haya na vile vinavyobadilika. Na tunahamisha mwisho moja kwa moja kwenye faili za hesabu wenyewe. Baada ya udanganyifu huu, inawezekana kuunda hesabu nyingine moja kwa moja kwenye saraka ya mazingira.

Itatumia tena hesabu ya group_vars, na pia itaweza kufafanua upya baadhi ya vigeu moja kwa moja yenyewe.

Muundo wa saraka ya mwisho ya mradi wa kupeleka:

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

Kwa muhtasari

Baada ya kuandaa vigezo kwa mujibu wa makala: kila faili ya kutofautiana inawajibika kwa kazi maalum. Na kwa kuwa faili ina kazi fulani, iliwezekana kumpa mtu anayehusika na usahihi wa kila faili. Kwa mfano, msanidi wa uwekaji wa mfumo huwa na jukumu la ujazaji sahihi wa vigeu vya kitabu cha kucheza, huku msimamizi ambaye msimamo wake umefafanuliwa kwenye orodha anawajibika moja kwa moja kwa kujaza hesabu ya vigeu.

Majukumu yakawa kitengo chao cha ukuzaji chenye kiolesura chao, kikiruhusu msanidi wa jukumu kukuza uwezo badala ya kurekebisha jukumu kwa mfumo. Tatizo hili lilihusu hasa majukumu ya kawaida ya mifumo yote katika kampeni.

Wasimamizi wa mfumo hawahitaji tena kuelewa msimbo wa kupeleka. Yote ambayo inahitajika kwao kwa kupelekwa kwa mafanikio ni kujaza faili za vigezo vinavyotegemea mazingira.

Fasihi

  1. Nyaraka

Mwandishi

Kalyuzhny Denis Alexandrovich

Chanzo: mapenzi.com

Kuongeza maoni