Asamblam Nginx-ul nostru cu câteva comenzi

Hi!
Numele meu este Sergey, lucrez ca inginer de infrastructură în echipa API a platformei tinkoff.ru.

În acest articol voi vorbi despre problemele cu care s-a confruntat echipa noastră atunci când a pregătit echilibratorii pe baza nginx pentru diverse proiecte. Vă voi spune și despre un instrument care mi-a permis să le depășesc pe majoritatea.

Nginx este un server proxy multifuncțional și în curs de dezvoltare. Dispune de un număr mare de module, aceasta nu este o listă completă. Fiecare proiect impune anumite cerințe privind funcționalitatea echilibratorului și versiunea Nginx (de exemplu, prezența http/2 și grpc proxy) și compoziția modulelor sale.

Am dori să vedem o versiune nouă cu setul necesar de module, care rulează sub o anumită distribuție Linux. În cazul nostru, acestea sunt sisteme bazate pe deb și rpm. Opțiunea cu containere nu este luată în considerare în acest articol.

Dorim să schimbăm rapid funcționalitatea balansoarelor noastre. Și aici apare imediat întrebarea: cum să realizați acest lucru cheltuind cât mai puține resurse? Ar fi chiar mai bine să setăm procesul astfel încât să putem specifica un număr finit de parametri de intrare, iar la ieșire să primim un artefact sub forma unui pachet deb/rpm pentru sistemul de operare dorit.

Ca urmare, pot fi formulate o serie de probleme:

  • Nu există întotdeauna pachete cu cea mai recentă versiune de Nginx.
  • Nu există pachete cu modulele necesare.
  • Compilarea și construirea manuală a unui pachet este consumatoare de timp și de-a dreptul plictisitoare.
  • Nu există o descriere a modului în care aceasta sau acea instanță Nginx este asamblată.

Pentru a rezolva aceste probleme, apare necesitatea unui instrument care să ia ca intrare o specificație într-un format care poate fi citit de om și să asambleze un pachet Nginx cu funcționalitatea necesară pe baza acestuia.

Negăsind o opțiune potrivită pentru noi pe vastitatea Github, am decis să ne creăm propriul instrument - nginx-builder.

Specificații

În instrumentul nostru, am vrut să creăm o descriere a specificației sub formă de cod, care poate fi apoi pus într-un depozit Git. Pentru a face acest lucru, am ales formatul familiar pentru astfel de lucruri - yaml. Exemplu de specificații:

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

Aici indicăm că vrem să vedem un pachet deb cu versiunea Nginx 1.14.2 cu setul necesar de module. Sectiunea cu module este optionala. Pentru fiecare dintre ele puteți seta:

  • Nume.
  • Adresa de unde il puteti procura:
    • Depozitul Git. De asemenea, puteți specifica o ramură sau o etichetă.
    • Arhivați linkul web.
    • Link local către arhivă.

Unele module necesită instalarea unor dependențe suplimentare, de exemplu, nginx-auth-ldap necesită instalarea libldap2-dev. Dependențele necesare pot fi specificate și atunci când descrieți modulul.

împrejurimi

În instrumentul nostru puteți obține rapid un mediu cu utilități instalate pentru compilare, asamblare de pachete și alte software auxiliare. Un container Docker cu tot ce aveți nevoie este ideal aici (depozitul are deja câteva exemple de fișiere Docker pentru ubuntu și centos).

După ce specificațiile sunt întocmite și mediul este pregătit, lansăm constructorul nostru, după ce i-am instalat anterior dependențele:

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

Numărul de revizuire de aici este opțional și este folosit pentru versiunea ansamblurilor. Este scris în meta-informațiile pachetului, ceea ce facilitează actualizarea pe servere.
Din jurnale puteți monitoriza ce se întâmplă. Iată un exemplu de puncte principale:

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'.

Deci, literalmente, cu câteva comenzi, creăm mediul și ansamblul Nginx necesar, iar pachetul apare în directorul de unde este lansat scriptul.

Încorporarea

De asemenea, putem integra instrumentul nostru în procesele CI/CD. Oricare dintre multele sisteme CI existente astăzi poate ajuta la acest lucru, de exemplu Teamcity sau Gitlab CI.

Ca rezultat, de fiecare dată când specificația se modifică în depozitul Git, construcția artefactului este lansată automat. Numărul de revizuire este legat de contorul de lansare a versiunii.
Cu puțin mai mult timp, puteți configura artefactul să fie trimis către depozitul local de pachete, Nexus, Artifactory și așa mai departe.

Un avantaj suplimentar este că fișierul de configurare yaml poate fi conectat la Ansible sau la un alt sistem de configurare automată, iar de acolo putem lua numărul versiunii și tipul pachetului pe care dorim să le implementăm.

Ce urmează

Proiectul nu este încă finalizat. Iată la ce lucrăm acum:

  • Extindem posibilitatea de configurare, dar în același timp o păstrăm cât mai simplă. Nu doriți să definiți o mie de parametri dacă aveți nevoie doar de doi, iar restul se potrivește implicit. Aceasta include indicatoarele de compilare (acum le puteți modifica în fișierul de configurare intern src/config.py), calea de instalare și utilizatorul de lansare.
  • Adăugăm opțiuni pentru trimiterea automată a unui pachet către diferite depozite de artefacte.
  • Executați o comandă personalizată când încărcați un modul (de exemplu, pentru a utiliza github.com/nginx-modules/nginx_upstream_check_module mai întâi trebuie să aplicați un patch dintr-o anumită versiune)
  • Adăugarea de teste:
    • Pachetul este instalat corect.
    • Nginx are versiunea necesară și este construit cu steagurile și modulele necesare.
    • Sunt create căile, conturile și așa mai departe necesare.

Dar puteți folosi acest instrument acum și, de asemenea, puteți sugera îmbunătățiri - github.com/TinkoffCreditSystems/Nginx-builder bun venit!

Sursa: www.habr.com

Adauga un comentariu