Paprasta rpm saugykla naudojant „Inotify“ ir „webdav“.

Šiame įraše apžvelgsime rpm artefaktų saugyklą naudodami paprastą inotify + Createrepo scenarijų. Artefaktai įkeliami per webdav naudojant apache httpd. Kodėl apache httpd bus parašyta įrašo pabaigoje.

Taigi, sprendimas turi atitikti šiuos reikalavimus, kad būtų galima organizuoti tik RPM saugyklą:

  • Laisvas

  • Paketo prieinamumas saugykloje praėjus kelioms sekundėms po įkėlimo į artefaktų saugyklą.

  • Lengva montuoti ir prižiūrėti

  • Galimybė užtikrinti aukštą prieinamumą

    Kodėl gi ne SonaType Nexus arba Pulp:

  • Sandėliavimas viduje SonaType Nexus arba Pulp daugelio rūšių artefaktai lemia tai SonaType Nexus arba Pulp tapti vienu nesėkmės tašku.

  • Didelis prieinamumas SonaType Nexus yra mokama.

  • Pulp Man atrodo per daug suprojektuotas sprendimas.

  • Artefaktai viduje SonaType Nexus saugomi blob. Staigaus elektros energijos tiekimo nutraukimo atveju negalėsite atkurti blob, jei neturėsite atsarginės kopijos. Mes turėjome šią klaidą: ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Error during data read for file 'privilege_5.pcl' 1-th attempt [java.io](http://java.io/).IOException: Bad address. Blobas niekada nebuvo atgautas.

Šaltinio kodas

→ Yra šaltinio kodas čia

Pagrindinis scenarijus atrodo taip:

#!/bin/bash

source /etc/inotify-createrepo.conf
LOGFILE=/var/log/inotify-createrepo.log

function monitoring() {
    inotifywait -e close_write,delete -msrq --exclude ".repodata|.olddata|repodata" "${REPO}" | while read events 
    do
      echo $events >> $LOGFILE
      touch /tmp/need_create
    done
}

function run_createrepo() {
  while true; do
    if [ -f /tmp/need_create ];
    then
      rm -f /tmp/need_create
      echo "start createrepo $(date --rfc-3339=seconds)"
      /usr/bin/createrepo --update "${REPO}"
      echo "finish createrepo $(date --rfc-3339=seconds)"
    fi
    sleep 1
  done
}

echo "Start filesystem monitoring: Directory is $REPO, monitor logfile is $LOGFILE"
monitoring >> $LOGFILE &
run_createrepo >> $LOGFILE &

Montavimas

inotify-createrepo veikia tik CentOS 7 ar naujesnėje versijoje. Nepavyko priversti jo veikti „CentOS 6“.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepo

Konfigūracija

Pagal numatytuosius nustatymus inotify-createrepo stebi katalogą /var/www/repos/rpm-repo/.

Šį katalogą galite pakeisti faile /etc/inotify-createrepo.conf.

Naudoti

Pridedant bet kokį failą į katalogą /var/www/repos/rpm-repo/ inotifywait sukurs failą /tmp/need_create. Funkcija run_createrepo veikia begaliniu ciklu ir stebi failą /tmp/need_create. Jei failas egzistuoja, paleiskite createrepo --update.

Faile pasirodys įrašas:

/var/www/repos/rpm-repo/ CREATE nginx-1.16.1-1.el7.ngx.x86_64.rpm
start createrepo 2020-03-02 09:46:21+03:00
Spawning worker 0 with 1 pkgs
Spawning worker 1 with 0 pkgs
Spawning worker 2 with 0 pkgs
Spawning worker 3 with 0 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
finish createrepo 2020-03-02 09:46:22+03:00

Galimybė užtikrinti aukštą prieinamumą

Jei norite užtikrinti aukštą esamo sprendimo prieinamumą, manau, kad galite naudoti 2 serverius: „Keepalived“, skirtą HA, ir „Lsyncd“ artefaktų sinchronizavimui. Lsyncd - demonas, kuris stebi pokyčius vietiniame kataloge, juos sujungia ir po tam tikro laiko rsync pradeda juos sinchronizuoti. Išsami informacija ir nustatymai aprašyti įraše "Greitas milijardo failų sinchronizavimas".

WebDav

Yra keli failų įkėlimo būdai: SSH, NFS, WebDav. „WebDav“ atrodo modernus ir paprastas pasirinkimas.

WebDav naudosime Apache httpd. Kodėl „Apache httpd“ 2020 m., o ne „nginx“?

Norėčiau naudoti automatizuotus įrankius Nginx + moduliams kurti (pavyzdžiui, Webdav).

Yra Nginx + modulių statybos projektas - nginx-builder. Jei failams įkelti naudojate nginx + wevdav, jums reikia modulio nginx-dav-ext-modulis. Bandant kurti ir naudoti Nginx su nginx-dav-ext-modulis pasinaudojant nginx-builder gausime klaidą Naudoja http_dav_module vietoj nginx-dav-ext-module. Ta pati klaida buvo uždaryta vasarą nginx: [emerg] nežinoma direktyva dav_methods.

Pateikiau traukimo prašymą Pridėkite patikrą git_url, ar nėra įterpto, pertvarkyto --with-{}_module и if module == "http_dav_module" pridėti --with. Bet jie nebuvo priimti.

config webdav.conf

DavLockDB /var/www/html/DavLock
<VirtualHost localhost:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog /var/log/httpd/error.log
    CustomLog /var/log/httpd/access.log combined

    Alias /rpm /var/www/repos/rpm-repo
    <Directory /var/www/repos/rpm-repo>
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

Manau, kad likusią Apache httpd konfigūraciją atliksite patys.

Nginx priešais Apache httpd

Skirtingai nuo „Apache“, „Nginx“ naudoja įvykiais pagrįstą užklausų apdorojimo modelį, o tai reiškia, kad bet kuriam klientų skaičiui reikalingas tik vienas HTTP serverio procesas. Galite naudoti nginx ir sumažinti serverio apkrovą.

nginx-front.conf konfig. Manau, kad likusią nginx konfigūraciją atliksite patys.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name ваш-виртуальных-хост;
    access_log /var/log/nginx/nginx-front-access.log main;
    error_log /var/log/nginx/nginx-front.conf-error.log warn;

    location / {
        proxy_pass http://nginx_front;
    }
}

Failų atsisiuntimas per WebDav

Atsisiųsti rpm yra labai paprasta.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ваш-виртуальный-хост/rpm/

Šaltinis: www.habr.com

Добавить комментарий