Përshëndetje!
Më quajnë Sergey, punoj inxhinier infrastrukture në ekipin e platformës API tinkoff.ru.
Në këtë artikull do të flas rreth problemeve me të cilat u përball ekipi ynë gjatë përgatitjes së balancuesve të bazuar në për projekte të ndryshme. Po ashtu do të flas për një mjet që na lejojti të tejkalojmë shumicën e tyre.
Nginx është një server proxy multifunksional dhe në zhvillim e sipër. Ai dallohet për numrin e madh të moduleve, . Çdo projekt ka kërkesa të veçanta për funksionalitetin e balancuesit dhe versionin e Nginx (për shembull, prania e http/2 dhe proxy-ing grpc), si dhe përbërjen e moduleve të tij.
Na duhen versione të reja me paketat e nevojshme që funksionojnë nën një shpërndarje të caktuar të Linux. Në rastin tonë kjo përfshin sistemet deb- dhe rpm-based. Mundësia e konteinerëve nuk shqyrtohet në këtë artikull.
Ne duam të ndryshojmë funksionalitetin e balancuesve tanë në mënyrë të shpejtë. Këtu menjëherë lind pyetja - si ta arrijmë këtë duke shpenzuar sa më pak burime? Po ashtu do të ishte mirë të organizojmë procesin në mënyrë që të mund të caktojmë një numër të caktuar parametrash hyrës, dhe në dalje të marrim një artefakt në formën e një pakete deb/rpm për sistemin operativ përkatës.
Mund të formulojmë një sërë problemeve:
- Nuk ka gjithmonë paketa me versionin e ri të Nginx.
- Nuk ka paketa me modulet e nevojshme.
- Kompilimi dhe ndërtimi i paketës manualisht merr shumë kohë dhe është thjesht e lodhshme.
- Nuk ka përshkrim se si është ndërtuar çdo instancë Nginx.
Për të zgjidhur këto probleme, lind nevoja për një mjet që do të merrte si hyrje një specifikim në një format lehtësisht të lexueshëm dhe do të ndërtonte paketën Nginx me funksionalitetin e kërkuar.
Pasi nuk gjetëm një opsion të përshtatshëm në hapësirën e GitHub-it, vendosëm të krijojmë mjetin tonë - .
Specifikimet
Në mjetin tonë dëshirojmë të krijojmë një përshkrim specifikimi në formë kodi, që më pas mund të vendoset në një depo Git. Për këtë seçuam një format të njohur për gjëra të tillë - yaml. Një shembull specifikimi:
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
Këtu tregojmë se duam të shohim një paketë deb me versionin Nginx 1.14.2 dhe një grup module të nevojshëm. Seksioni me modulet është opsional. Për secilin prej tyre mund të caktojmë:
- Emrin.
- Adresën ku mund të merret:
- Repo git. Gjithashtu mund të specifikohet degë ose etiketë.
- Lidhje web për arkiv.
- Lidhje lokale për arkiv.
Disa module kërkojnë instalimin e varësive të tjera, për shembull për nginx-auth-ldap kërkohet që libldap2-dev të jetë instaluar. Varësitë e nevojshme gjithashtu mund të specifikohen gjatë përshkrimit të modulit.
Mjedisi
Me mjetin tonë mund të merrni shpejt një ambient me utilitarët e instaluar për kompaktimin, ndërtimin e paketës dhe programet ndihmëse të tjera. Këtu përshtatet më së miri një konteiner docker me të gjitha të nevojshmet (në depo tashmë ka disa shembuj docker-tilesh për ubuntu dhe centos).
Pasi specifikimi të jetë bërë dhe ambienti të jetë përgatitur, ne fillojmë ndërtuesin tonë, pasi të kemi instaluar varësitë e tij:
pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]
Numri i përditësimit këtu është opsional dhe shërben për versionimin e ndërtimeve. Ai regjistrohet në metainformacionin e paketës, që lejon përditësimin e lehtë të saj në serverat.
Përmes logeve mund të ndiqni se çfarë po ndodh. Ja një shembull i pikave kryesore:
builder - INFO - Shkruaj skedarin yaml: example.config.yaml
builder - INFO - Shkarko skriptet për ndërtimin e paketës deb
builder - INFO - Po shkarko burimet e nginx...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Po shkarko modulet 3d-party...
builder - INFO - Moduli nginx-auth-ldap do të shkarkohet sipas degës
builder - INFO - -- Përfunduar: nginx-auth-ldap
builder - INFO - -- Përfunduar: ngx_http_substitutions_filter_module
builder - INFO - Moduli headers-more-nginx-module do të shkarkohet
builder - INFO - Moduli nginx-module-vts do të shkarkohet sipas etiketës
builder - INFO - -- Përfunduar: nginx-module-vts
builder - INFO - Moduli ngx_devel_kit do të shkarkohet sipas etiketës
builder - INFO - -- Përfunduar: ngx_devel_kit
builder - INFO - -- Përfunduar: ngx_cache_purge
builder - INFO - -- Përfunduar: ngx_http_dyups_module
builder - INFO - Po shkarko varësitë
builder - INFO - Po ndërtohet paketa .deb
builder - INFO - Po ekzekutohet 'dh_make'...
builder - INFO - Po ekzekutohet 'dpkg-buildpackage'...
dpkg-deb: po ndërtohet paketa 'nginx' në '../nginx_1.14.1-1_amd64.deb'.
Kështu, me disa komanda, krijojmë ambientin dhe ndërtimin e nevojshëm të Nginx, dhe paketa shfaqet në drejtorinë nga e cila është ekzekutuar skripti.
Integrimi
Gjithashtu mund ta integrojmë mjetin tonë në proceset CI/CD. Kjo mund të ndihmohet nga ndonjë nga shumë sistemet CI që ekzistojnë sot, për shembull ose .
Në fund, me çdo ndryshim në specifikimin në repositorin Git, ndërtimi i artefaktit aktivizohet automatikisht. Numri i rishikimeve lidhet me numëruesin e ekzekutimeve të ndërtimit.
Duke shpenzuar pak më shumë kohë, mund të konfigurojmë dërgimin e artefaktit në një repositor lokal të pakove, Nexus, Artifactory dhe më shumë.
Një përfitim shtesë është se skedari yaml konfigurues mund të lidhet me Ansible ose një sistem tjetër të konfigurimit automatik, duke marrë nga aty numrin e versionit dhe llojin e pakos që duam të publikojmë.
Çfarë ndodh më pas
Projekti ende nuk është përfunduar. Këtu është për çfarë jemi duke punuar tani:
- Po zgjeroni mundësinë e konfigurimit, por duke ruajtur sa më të thjeshtë. Nuk dëshirojmë të përcaktojmë një mijë parametra nëse na nevojiten vetëm dy, ndërsa të tjerët janë të pranueshëm si parazgjedhje. Kjo përfshin flagjet e kompjuterit (momentalisht i ndryshojmë ato në skedarin e brendshëm të konfigurimit src/config.py), rrugët e instalimit, përdoruesin për ekzekutimin.
- Po shtojmë mundësi dërgimi automatik të paketave në depo të ndryshme artefaktesh.
- Ekzekutimi i komandave përdoruese gjatë ngarkimit të modulit (për shembull për përdorimin e duhet së pari të aplikoni patch-in e versionit përkatës)
- Shtojmë zhvillimin e testeve:
- Paketa instalohet siç duhet.
- Nginx ka versionin e duhur dhe është ndërtuar me flagjet dhe modulat e kërkuara.
- Krijohen rrugët, llogaritë dhe më shumë.
Por mund ta përdorni këtë mjet tashmë, si dhe të propozni përmirësime — mirë se vini!
Burimi: habr.com
