Муносибати системавӣ ба тағирёбандаҳо дар Ansible

ansible devops codestyle

Эй! Номи ман Денис Калюжний Ман ҳамчун муҳандис дар шӯъбаи автоматикунонии равандҳои коркард кор мекунам. Ҳар рӯз, дар садҳо серверҳои таблиғотӣ барномаҳои нав таҳия карда мешаванд. Ва дар ин мақола ман таҷрибаи худро дар бораи истифодаи Ansible бо ин мақсадҳо мубодила мекунам.

Ин дастур роҳи ташкили тағирёбандаҳоро дар густариш пешниҳод мекунад. Ин дастур барои онҳое пешбинӣ шудааст, ки аллакай дар китобҳои бозӣ нақшҳоро истифода мебаранд ва хондаанд Беҳтарин таҷрибаҳо, аммо бо мушкилоти шабеҳ дучор мешавад:

  • Пас аз пайдо кардани тағирёбанда дар код, фавран фаҳмидан мумкин нест, ки он барои чӣ масъул аст;
  • Якчанд нақшҳо вуҷуд доранд ва тағирёбандаҳо бояд бо як арзиш алоқаманд бошанд, аммо он танҳо кор намекунад;
  • Бо душворӣ ба дигарон фаҳмонидани он, ки мантиқи тағирёбандаҳо дар китобҳои бозии шумо чӣ гуна кор мекунад

Мо бо ин мушкилот дар лоиҳаҳои ширкати худ дучор омадем, ки дар натиҷа мо ба қоидаҳои тарҳрезии тағирёбандаҳо дар китобҳои бозӣ омадем, ки то андозае ин мушкилотро ҳал кард.

Муносибати системавӣ ба тағирёбандаҳо дар Ansible

Тағирёбандаҳо дар нақшҳо

Нақш як объекти алоҳидаи системаи ҷойгиркунӣ мебошад. Мисли ҳама гуна объекти система, он бояд интерфейси ҳамкорӣ бо боқимондаи система дошта бошад. Чунин интерфейс тағирёбандаҳои нақш мебошад.

Масалан, рольро гирем api, ки барномаи Java-ро дар сервер насб мекунад. Кадом тағирёбандаҳо метавонанд дошта бошанд?

Муносибати системавӣ ба тағирёбандаҳо дар Ansible

Нақшҳои тағирёбандаро аз рӯи намуд метавон ба 2 намуд тақсим кард:

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

Хусусиятҳои тағирёбанда тағирёбандаҳое мебошанд, ки рафтори нақшро муайян мекунанд.

Тағйирёбандаҳои дархост - инҳо тағирёбандаҳое мебошанд, ки арзиши онҳо барои таъин кардани захираҳои берунии нақш истифода мешавад.

Шунавандагони тағирёбанда - инҳо тағирёбандаҳое мебошанд, ки арзиши онҳо барои ташаккули тағирёбандаҳои дархост истифода мешавад.

Аз тарафи дигар, 1a, 2a, 2b тағирёбандаҳое мебошанд, ки аз муҳити атроф (сахтафзор, захираҳои беруна ва ғайра) вобаста нестанд ва метавонанд бо арзишҳои пешфарз дар нақши пешфарз пур карда шаванд. Аммо, пур кардани тағирёбандаҳои навъи 1.b ва 2.c бо арзишҳои ғайр аз "намуна" ғайриимкон аст, зеро онҳо вобаста ба муҳити зист аз стенд ба стенд иваз мешаванд.

Услуби код

  • Номи тағирёбанда бояд бо номи нақш оғоз шавад. Ин имкон медиҳад, ки дар оянда муайян карда шавад, ки тағирёбанда аз кадом нақш ва барои чӣ масъул аст.
  • Ҳангоми истифодаи тағирёбандаҳо дар нақшҳо, шумо бояд боварӣ ҳосил кунед, ки принсипи инкапсуляцияро риоя кунед ва тағирёбандаҳоро дар худи нақш ё дар нақшҳое, ки нақши ҷорӣ аз он вобаста аст, истифода баред.
  • Аз истифодаи луғатҳо барои тағирёбанда худдорӣ кунед. Ansible ба шумо имкон намедиҳад, ки арзишҳои инфиродӣ дар луғатро ба таври қулай иваз кунед.

    Намунаи тағирёбандаи бад:

    myrole_user:
        login: admin
        password: admin

    Дар ин ҷо воридшавӣ тағирёбандаи мустақил ва парол тағирёбандаи вобаста аст. Аммо
    зеро онҳо ба луғат муттаҳид шудаанд, шумо бояд онро пурра муайян кунед
    Ҳамеша. Ки хеле нороҳат аст. Ин тавр беҳтар аст:

    myrole_user_login: admin
    myrole_user_password: admin

Тағирёбандаҳо дар китобҳои паҳнкунӣ

Ҳангоми тартиб додани китоби бозӣ (минбаъд - китоби бозӣ) мо қоидаро риоя мекунем, ки он бояд дар анбори алоҳида ҷойгир карда шавад. Ҳамон тавре ки нақшҳо: ҳар як дар анбори git худ. Ин ба шумо имкон медиҳад фаҳмед, ки нақшҳо ва китоби бозӣ объектҳои гуногуни мустақили системаи ҷойгиркунӣ мебошанд ва тағирот дар як объект набояд ба кори объекти дигар таъсир расонад. Ин тавассути тағир додани арзишҳои пешфарзии тағирёбандаҳо ба даст оварда мешавад.

Ҳангоми тартиб додани китоби бозӣ, барои ҷамъбаст, мумкин аст, ки арзишҳои пешфарзии тағирёбандаҳои нақшро дар ду ҷой иваз кунед: дар тағирёбандаҳои китоби бозӣ ва дар тағирёбандаҳои инвентаризатсия.

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

* - Тағйирёбандаҳо ва анборҳо

Фарқият дар он аст, ки тағирёбандаҳои китобҳои бозӣ ҳамеша ҳангоми занг задан ба китобҳои бозӣ, ки дар як сатҳ ҷойгиранд, истифода мешаванд. Ин маънои онро дорад, ки ин тағирёбандаҳо барои тағир додани арзишҳои пешфарзии тағирёбандаҳои аз муҳити зист мустақил мебошанд. Баръакс, тағирёбандаҳои инвентаризатсия танҳо барои муҳити мушаххас истифода мешаванд, ки барои тағирёбандаҳои муҳити зист беҳтарин аст.

Қайд кардан муҳим аст, ки афзалияти тағирёбанда ба шумо имкон намедиҳад, ки тағирёбандаҳоро аввал дар тағирёбандаҳои китоби бозӣ ва сипас дар як инвентаризатсия ҷудо кунед.

Ин маънои онро дорад, ки аллакай дар ин марҳила тасмим гирифтан лозим аст, ки тағирёбанда аз муҳити атроф вобаста аст ё не ва онро дар ҷои мувофиқ ҷойгир кунед.

Масалан, дар як лоиҳа, тағирёбандае, ки барои фаъол кардани SSL масъул аст, муддати тӯлонӣ аз муҳити зист вобаста буд, зеро мо натавонистем SSL-ро бо сабабҳое, ки аз мо вобастаанд, дар яке аз стендҳо фаъол созем. Пас аз он ки мо ин мушкилотро ҳал кардем, он аз муҳити зист мустақил шуд ва ба тағирёбандаҳои китоби бозӣ гузашт.

Тағйирёбандаҳои моликият барои гурӯҳҳо

Биёед модели худро дар расми 1 бо илова кардани 2 гурӯҳи серверҳо бо барномаи дигари Java, вале бо танзимоти гуногун васеъ кунем.

Муносибати системавӣ ба тағирёбандаҳо дар Ansible

Биёед тасаввур кунем, ки дар ин ҳолат китоби бозӣ чӣ гуна хоҳад буд:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Мо дар китоби бозӣ се гурӯҳ дорем, аз ин рӯ фавран тавсия дода мешавад, ки дар тағирёбандаҳои инвентаризатсияи group_vars ва тағирёбандаҳои китоби бозӣ ҳамон миқдори файлҳои гурӯҳӣ эҷод кунед. Як файли гурӯҳӣ дар ин ҳолат тавсифи як ҷузъи замимаи боло дар китоби бозӣ мебошад. Вақте ки шумо файли гурӯҳро дар тағирёбандаҳои китоби бозӣ мекушоед, шумо фавран ҳамаи фарқиятҳоро аз рафтори пешфарзи нақшҳои дар гурӯҳ насбшуда мебинед. Дар тағирёбандаҳои инвентаризатсия: фарқиятҳо дар рафтори гурӯҳӣ аз стенд то стенд.

Услуби код

  • Кӯшиш кунед, ки тағирёбандаҳои host_vars-ро умуман истифода набаред, зеро онҳо системаро тавсиф намекунанд, балки танҳо як ҳолати махсус, ки дар оянда ба саволҳои зерин оварда мерасонад: "Чаро ин ҳост аз дигарон фарқ мекунад?", ки ҷавоби он нест. ҳамеша осон пайдо кардан.

Тағйирёбандаҳои коммуникатсия

Бо вуҷуди ин, он чизест, ки тағирёбандаҳои моликият дар бораи он ҳастанд, аммо дар бораи тағирёбандаҳои коммуникатсионӣ чӣ гуфтан мумкин аст?
Фарқияти онҳо дар он аст, ки онҳо бояд дар гурӯҳҳои гуногун як маъно дошта бошанд.

Дар аввал чунин буд идея як сохтмони даҳшатоварро истифода баред, ба монанди:
hostvars[groups['bbauth'][0]]['auth_bind_port'], вале онхо фавран онро рад карданд
зеро он камбудихо дорад. Пеш аз ҳама, ҳаҷм. Дуюм, вобастагӣ аз як мизбони мушаххас дар гурӯҳ. Сеюм, пеш аз оғози ҷойгиркунӣ, бояд аз ҳама ҳостҳо далелҳоро ҷамъоварӣ кунем, агар мо намехоҳем, ки хатогии тағирёбандаи номуайянро ба даст орем.

Дар натиҷа, тасмим гирифта шуд, ки тағирёбандаҳои коммуникатсионӣ истифода шаванд.

Тағйирёбандаҳои коммуникатсия - инҳо тағирёбандаҳое мебошанд, ки ба китоби бозӣ тааллуқ доранд ва барои пайваст кардани объектҳои система заруранд.

Тағйирёбандаҳои коммуникатсионӣ дар тағирёбандаҳои умумии система пур карда мешаванд group_vars/all/vars ва аз ҳар гурӯҳ хориҷ кардани ҳамаи тағирёбандаҳои шунаванда ва ба аввали тағирёбанда илова кардани номи гурӯҳе, ки шунаванда аз он хориҷ шудааст, ташкил карда мешаванд.

Ин якранг ва такрор нашудани номҳоро таъмин мекунад.

Биёед кӯшиш кунем, ки тағирёбандаҳоро аз мисоли дар боло овардашуда пайваст кунем:

Муносибати системавӣ ба тағирёбандаҳо дар Ansible

Биёед тасаввур кунем, ки мо тағирёбандаҳое дорем, ки аз ҳамдигар вобастаанд:

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

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

Биёед онро ба тағирёбандаҳои умумӣ гузорем group_vars/all/vars ҳамаи шунавандагон ва номи гурӯҳро ба сарлавҳа илова кунед:

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

Акнун, бо тағир додани арзиши пайвасткунак, мо итминон хоҳем дошт, ки дархост ба ҳамон ҷое, ки порт ҷойгир аст, меравад.

Услуби код

  • Азбаски нақшҳо ва гурӯҳҳо объектҳои гуногуни система мебошанд, онҳо бояд номҳои гуногун дошта бошанд, пас тағирёбандаҳои истинод ба таври дақиқ нишон медиҳанд, ки онҳо ба як гурӯҳи мушаххаси серверҳо тааллуқ доранд, на ба нақш дар система.

Файлҳои вобаста ба муҳити зист

Нақшҳо метавонанд файлҳоеро истифода баранд, ки аз муҳит ба муҳит фарқ мекунанд.

Намунаи чунин файлҳо сертификатҳои SSL мебошанд. Онҳоро дар шакли матн нигоҳ доред
дар як тағйирёбанда аст, хеле қулай нест. Аммо нигоҳ доштани роҳ ба онҳо дар дохили як тағирёбанда қулай аст.

Масалан, мо тағирёбандаро истифода мебарем api_ssl_key_file: "/path/to/file".

Азбаски маълум аст, ки сертификати калидӣ аз муҳит ба муҳит иваз мешавад, ин як тағирёбандаи аз муҳити зист вобаста аст, яъне он бояд дар файл ҷойгир карда шавад
group_vars/myapi/vars инвентаризатсияи тағирёбандаҳо ва дорои арзиши "масалан".

Роҳи аз ҳама мувофиқ дар ин ҳолат гузоштани файли калидӣ дар анбори китобҳои бозӣ дар қад-қади роҳ аст
files/prod/certs/myapi.key, он гоҳ арзиши тағирёбанда хоҳад буд:
api_ssl_key_file: "prod/certs/myapi.key". Бароҳатӣ дар он аст, ки одамоне, ки барои ҷойгиркунии система дар як стенди мушаххас масъуланд, инчунин дар анбор фазои махсуси худро барои нигоҳ доштани файлҳои худ доранд. Ҳамзамон, дар сервер муайян кардани роҳи мутлақ ба сертификат имконпазир боқӣ мемонад, агар сертификатҳо аз ҷониби системаи дигар пешниҳод карда шаванд.

Якчанд стенд дар як муҳит

Аксар вақт зарурати ҷойгир кардани якчанд стендҳои тақрибан якхела дар як муҳит бо фарқиятҳои ҳадди аққал вуҷуд дорад. Дар ин ҳолат мо тағирёбандаҳои аз муҳити зист вобастаро ба онҳое, ки дар ин муҳит тағир намеёбанд ва тағирёбандаҳо тақсим мекунем. Ва мо охиринро бевосита ба худи файлҳои инвентаризатсия интиқол медиҳем. Пас аз ин таҳрир, мустақиман дар феҳристи муҳити зист инвентаризатсияи дигар эҷод кардан мумкин аст.

Он инвентаризатсияи group_varsро дубора истифода хоҳад кард ва инчунин метавонад баъзе тағирёбандаҳоро мустақиман барои худ аз нав муайян кунад.

Сохтори ниҳоии феҳрист барои лоиҳаи ҷойгиркунӣ:

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

Ҷамъбаст кардан

Пас аз ташкили тағирёбандаҳо мувофиқи мақола: ҳар як файли тағирёбанда барои вазифаи мушаххас масъул аст. Ва азбаски файл вазифаҳои муайян дорад, имкон пайдо шуд, ки касеро барои дурустии ҳар як файл таъин кунад. Масалан, таҳиягари густариши система барои пур кардани дурусти тағирёбандаҳои китоби бозӣ масъул мешавад, дар ҳоле ки маъмуре, ки стенди он дар инвентаризатсия тавсиф шудааст, барои пур кардани инвентаризатсияи тағирёбандаҳо бевосита масъул аст.

Нақшҳо бо интерфейси худ ба воҳиди рушди худ табдил ёфтанд, ки ба таҳиягари нақш имкон медиҳад, на он ки нақшро ба система мутобиқ кунад, қобилиятҳоро инкишоф диҳад. Ин мушкилот махсусан ба нақшҳои умумии ҳамаи системаҳои маърака дахл дошт.

Ба маъмурони система дигар лозим нест, ки рамзи густаришро фаҳманд. Ҳамаи он чизе, ки аз онҳо барои татбиқи бомуваффақият талаб карда мешавад, пур кардани файлҳои тағирёбандаҳои аз муҳити зист вобаста аст.

Эълон

  1. сабт

муаллиф

Калюжний Денис Александрович

Манбаъ: will.com

Илова Эзоҳ