Eenvoudige rpm-bewaarplek met behulp van Inotify en webdav

In hierdie pos sal ons kyk na die rpm-artefakberging met behulp van 'n eenvoudige skrif met inotify + createrepo. Die oplaai van artefakte word uitgevoer via webdav met behulp van apache httpd. Hoekom apache httpd sal aan die einde van die pos geskryf word.

Die oplossing moet dus aan die volgende vereistes voldoen om slegs RPM-berging te organiseer:

  • gratis

  • Beskikbaarheid van die pakket in die bewaarplek 'n paar sekondes nadat dit na die artefakbewaarplek opgelaai is.

  • Maklik om te installeer en in stand te hou

  • Vermoë om hoë beskikbaarheid te maak

    Hoekom nie SonaType Nexus of Pulp:

  • Berging in SonaType Nexus of Pulp baie soorte artefakte lei tot die feit dat SonaType Nexus of Pulp word 'n enkele punt van mislukking.

  • Hoë beskikbaarheid in SonaType Nexus betaal word.

  • Pulp Lyk vir my na 'n te ingewikkelde oplossing.

  • Artefakte in SonaType Nexus word in blob gestoor. As daar 'n skielike kragonderbreking is, sal jy nie die blob kan herstel as jy nie 'n rugsteun het nie. Ons het hierdie fout gehad: 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. Blob is nooit herstel nie.

Bronkode

→ Bronkode is geleë hier

Die hoofskrif lyk soos volg:

#!/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 &

installasie

Inotify-createrepo werk net op CentOS 7 of hoër. Kon dit nie op CentOS 6 laat werk nie.

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

Konfigurasie

By verstek monitor inotify-createrepo die gids /var/www/repos/rpm-repo/.

Jy kan hierdie gids in die lêer verander /etc/inotify-createrepo.conf.

Gebruik

Wanneer enige lêer by 'n gids gevoeg word /var/www/repos/rpm-repo/ inotifywait sal die lêer skep /tmp/need_create. Die run_createrepo-funksie loop in 'n eindelose lus en monitor die lêer /tmp/need_create. As die lêer bestaan, loop dit createrepo --update.

'n Inskrywing sal in die lêer verskyn:

/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

Vermoë om hoë beskikbaarheid te maak

Om hoë beskikbaarheid van 'n bestaande oplossing te maak, dink ek jy kan 2 bedieners gebruik, Keepalived vir HA en Lsyncd vir sinchronisering van artefakte. Lsyncd - 'n daemoon wat veranderinge in 'n plaaslike gids monitor, dit saamvoeg, en na 'n sekere tyd begin rsync dit sinchroniseer. Besonderhede en opstelling word beskryf in die pos "Vinnige sinchronisasie van 'n miljard lêers".

WebDav

U kan lêers op verskeie maniere oplaai: SSH, NFS, WebDav. WebDav blyk 'n moderne en eenvoudige opsie te wees.

Vir WebDav sal ons Apache httpd gebruik. Waarom Apache httpd in 2020 en nie nginx nie?

Ek wil graag outomatiese gereedskap gebruik om Nginx + modules te bou (byvoorbeeld Webdav).

Daar is 'n projek om Nginx + modules te bou - Nginx-bouer. As jy nginx + wevdav gebruik om lêers op te laai, benodig jy 'n module nginx-dav-ext-module. Wanneer jy probeer om Nginx te bou en te gebruik met nginx-dav-ext-module Met die hulp van Nginx-bouer ons sal 'n fout kry Gebruik deur http_dav_module in plaas van nginx-dav-ext-module. Dieselfde gogga is in die somer toegemaak nginx: [emerg] onbekende richtlijn dav_methods.

Ek het 'n Trek-versoek gedoen Voeg tjek git_url by vir ingebedde, refactored —with-{}_module и as module == "http_dav_module" byvoeg --met. Maar hulle is nie aanvaar nie.

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>

Ek dink jy kan die res van die Apache httpd-opstelling self doen.

Nginx voor Apache httpd

Anders as Apache, gebruik Nginx 'n gebeurtenis-gebaseerde versoekverwerkingsmodel, wat slegs een HTTP-bedienerproses vir enige aantal kliënte vereis. U kan nginx gebruik en die las op die bediener verminder.

Stel nginx-front.conf op. Ek dink jy kan die res van die nginx-opstelling self doen.

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;
    }
}

Laai lêers op via WebDav

Die laai van rpm is baie eenvoudig.

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

Bron: will.com

Voeg 'n opmerking