Збіраны свой Nginx парай каманд

Прывітанне!
Мяне клічуць Сяргей, я працую інфраструктурным інжынерам у камандзе API платформы tinkoff.ru.

У гэтым артыкуле я раскажу аб праблемах, з якімі сутыкалася наша каманда пры падрыхтоўцы балансавальнікаў на аснове. Nginx для розных праектаў. Таксама раскажу пра інструмент, які дазволіў пераадолець большую частку з іх.

Nginx - гэта шматфункцыянальны і актыўна развіваецца проксі-сервер. Ён адрозніваецца вялікай колькасцю модуляў, вось далёка не поўны спіс. Кожны праект накладае пэўныя патрабаванні да функцыяналу балансавальніка і версіі Nginx (напрыклад наяўнасць http/2 і праксіраванне grpc), і складу яго модуляў.

Нам жадаецца бачыць свежую версію з патрэбным наборам модуляў, якая працуе пад вызначаным дыстрыбутывам Linux. У нашым выпадку гэта deb-і rpm-based сістэмы. Варыянт з кантэйнерамі ў дадзеным артыкуле не разглядаецца.

Нам хочацца аператыўна змяняць функцыянал нашых балансіроўшчыкаў. І тут адразу паўстае пытанне — як гэтага дабіцца, затраціўшы як мага менш рэсурсаў? А яшчэ б лепш наладзіць працэс так, каб мы маглі задаць канчатковы лік уваходных параметраў, а на вынахадзе атрымаць артэфакт у выглядзе deb/rpm пакета для патрэбнай АС.

У выніку можна сфармуляваць шэраг праблем:

  • Не заўсёды ёсць пакеты са свежай версіяй Nginx.
  • Няма пакетаў з патрэбнымі модулямі.
  • Кампіляцыя і зборка пакета ўручную займае шмат часу і папросту стомная.
  • Няма апісання, як сабраны той ці іншы інстанс Nginx.

Каб вырашыць гэтыя праблемы, напрошваецца нейкая прылада, які прымаў бы на ўваход спецыфікацыю ў чалавекачытаемым фармаце і збіраў па ёй пакет Nginx з патрэбным функцыяналам.

Не знайшоўшы прыдатнага для нас варыянту на прасторах гітхаба, мы вырашылі стварыць свой інструмент. nginx-builder.

Спецыфікацыі

У нашай прыладзе мы жадалі ствараць апісанне спецыфікацыі ў выглядзе кода, які затым можна пакласці ў Git-рэпазітар. Для гэтага абралі звыклы для падобных рэчаў фармат - yaml. Прыклад спецыфікацыі:

nginx_version: 1.14.1
output_package: deb
modules:
  - module:
      name: nginx-auth-ldap
      git_url: https://github.com/kvspb/nginx-auth-ldap.git
      git_branch: master
      dependencies:
        - libldap2-dev
  - module:
      name: ngx_http_substitutions_filter_module
      git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
  - module:
      name: headers-more-nginx-module
      web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
  - module:
      name: nginx-module-vts
      git_url: https://github.com/vozlt/nginx-module-vts.git
      git_tag: v0.1.18
  - module:
      name: ngx_devel_kit
      git_url: https://github.com/simplresty/ngx_devel_kit.git
      git_tag: v0.3.0
  - module:
      name: ngx_cache_purge
      git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
  - module:
      name: ngx_http_dyups_module
      git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
  - module:
      name: nginx-brotli
      git_url: https://github.com/eustas/ngx_brotli.git
      git_tag: v0.1.2
  - module:
      name: nginx_upstream_check_module
      git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
  - module:
      name: njs
      git_url: https://github.com/nginx/njs.git
      git_tag: 0.2.5
      config_folder_path: nginx

Тут мы паказваем, што жадаем бачыць deb-пакет з версіяй Nginx 1.14.2 з патрэбным наборам модуляў. Секцыя з модулямі - апцыянальная. Для кожнага з іх можна задаць:

  • Назва.
  • Адрас, дзе яго можна атрымаць:
    • Git-рэпазітар. Таксама можна паказаць галінку ці тэг.
    • Вэб-спасылка на архіў.
    • Лакальная спасылка на архіў.

Некаторыя модулі патрабуюць усталёўкі дадатковых залежнасцяў, напрыклад для nginx-auth-ldap патрэбен усталяваны libldap2-dev. Неабходныя залежнасці таксама можна пазначыць пры апісанні модуля.

атачэнне

У нашай прыладзе можна хутка атрымліваць асяроддзе з усталяванымі ўтылітамі для кампіляцыі, зборкі пакета і іншым дапаможным ПА. Тут як нельга лепш падыходзіць docker-кантэйнер са ўсім неабходным (у рэпазітары ўжо ёсць пары прыкладаў docker-файлаў для ubuntu і centos).

Пасля таго, як спецыфікацыя складзена і падрыхтавана асяроддзе, мы запускаем наш зборшчык, папярэдне ўсталяваўшы яго залежнасці:

pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]

Нумар рэвізіі тут апцыянальны і служыць для версіявання зборак. Ён запісваецца ў метаінфармацыю пакета, што дазваляе лёгка абнаўляць яго на сэрверах.
Па логах можна назіраць за тым, што адбываецца. Вось прыклад асноўных момантаў:

builder - INFO - Parse yaml file: example.config.yaml
builder - INFO - Download scripts for build deb package
builder - INFO - Downloading nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloading 3d-party modules...
builder - INFO - Module nginx-auth-ldap will download by branch
builder - INFO - -- Done: nginx-auth-ldap
builder - INFO - -- Done: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module will downloading
builder - INFO - Module nginx-module-vts will download by tag
builder - INFO - -- Done: nginx-module-vts
builder - INFO - Module ngx_devel_kit will download by tag
builder - INFO - -- Done: ngx_devel_kit
builder - INFO - -- Done: ngx_cache_purge
builder - INFO - -- Done: ngx_http_dyups_module
builder - INFO - Downloading dependencies
builder - INFO - Building .deb package
builder - INFO - Running 'dh_make'...
builder - INFO - Running 'dpkg-buildpackage'...
dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'.

Так літаральна парай каманд мы ствараем асяроддзе і патрэбную зборку Nginx, і пакет з'яўляецца ў дырэкторыі, адкуль запушчаны скрыпт.

Убудаванне

Таксама мы можам убудаваць наш інструмент у CI/CD працэсы. У гэтым можа дапамагчы любая з мноства існуючых на сённяшні дзень CI-сістэм, напрыклад Teamcity або Gitlab CI.

У выніку пры кожнай змене спецыфікацыі ў Git-рэпазітары аўтаматычна запускаецца зборка артэфакта. Нумар рэвізіі прывязваецца да лічыльніка запускаў білда.
Выдаткаваўшы яшчэ трохі чакай, можна наладзіць адпраўку артэфакта ў лакальны рэпазітар пакетаў, Nexus, Artifactory і гэтак далей.

Дадатковым плюсам з'яўляецца тое, што канфігурацыйны yaml-файл можна падлучыць у Ansible ці іншую сістэму аўтаматычнага канфігуравання, і браць адтуль нумар версіі і тыпу пакета, якія мы жадаем задэплоіць.

Што далей

Праект яшчэ не завершаны. Вось над чым мы працуем зараз:

  • Пашыраем магчымасць канфігуравання, але пры гэтым захоўваем яе максімальна просты. Не жадаецца вызначаць тысячу параметраў, калі трэба ўсяго два, а астатняе падыходзіць па змаўчанні. Да гэтага ставяцца сцягі кампіляцыі (цяпер змяніць іх можна ва ўнутраным файле канфігурацыі src/config.py), шляхі ўсталёўкі, карыстача для запуску.
  • Дадаем варыянты аўтаматычнай адпраўкі пакета ў розныя сховішчы артэфактаў.
  • Выкананне карыстацкай каманды пры загрузцы модуля (напрыклад для выкарыстання github.com/nginx-modules/nginx_upstream_check_module трэба спачатку ўжыць патч вызначанай версіі)
  • Дадаем правядзенне тэстаў:
    • Пакет карэктна ўстанаўліваецца.
    • Nginx мае патрэбную версію і сабраны з патрабаванымі сцягамі і модулямі.
    • Ствараюцца патрэбныя шляхі, уліковыя запісы і гэтак далей.

Але карыстацца гэтым інструментам вы можаце ўжо зараз, а таксама прапаноўваць дапрацоўкі. github.com/TinkoffCreditSystems/Nginx-builder wellcome!

Крыніца: habr.com

Дадаць каментар