Enkelt rpm-förråd med Inotify och webdav

I det här inlägget kommer vi att titta på ett rpm-artefaktlager med ett enkelt inotify + createrepo-skript. Artefakter laddas upp via webdav med apache httpd. Varför apache httpd kommer att skrivas mot slutet av inlägget.

Så lösningen måste uppfylla följande krav för att organisera endast RPM-lagring:

  • fri

  • Tillgänglighet för paketet i förvaret några sekunder efter uppladdning till artefaktförrådet.

  • Lätt att installera och underhålla

  • Förmåga att göra hög tillgänglighet

    Varför inte SonaType Nexus eller Massa:

  • Förvaring i SonaType Nexus eller Massa många typer av artefakter leder till det faktum att SonaType Nexus eller Massa bli en enda punkt av misslyckande.

  • Hög tillgänglighet i SonaType Nexus är betalad.

  • Massa Verkar som en överkonstruerad lösning för mig.

  • Artefakter i SonaType Nexus lagras i blob. I händelse av ett plötsligt strömavbrott kommer du inte att kunna återställa blubben om du inte har en backup. Vi hade detta fel: 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 återfanns aldrig.

Källkod

→ Källkoden finns här

Huvudskriptet ser ut så här:

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

Installation

inotify-createrepo fungerar bara på CentOS 7 eller högre. Kunde inte få det att fungera på CentOS 6.

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

Konfiguration

Som standard övervakar inotify-createrepo en katalog /var/www/repos/rpm-repo/.

Du kan ändra denna katalog i filen /etc/inotify-createrepo.conf.

Använd

När du lägger till en fil i en katalog /var/www/repos/rpm-repo/ inotifywait kommer att skapa en fil /tmp/need_create. Funktionen run_createrepo körs i en oändlig slinga och övervakar filen /tmp/need_create. Om filen finns, kör sedan createrepo --update.

En post kommer att visas i filen:

/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

Förmåga att göra hög tillgänglighet

För att göra hög tillgänglighet av en befintlig lösning tror jag att du kan använda 2 servrar, Keepalived för HA och Lsyncd för artefaktsynkronisering. Lsyncd - en demon som övervakar ändringar i den lokala katalogen, samlar dem och efter en viss tid börjar rsync synkronisera dem. Detaljer och inställningar beskrivs i inlägget "Snabb synkronisering av en miljard filer".

WebDav

Det finns flera sätt att ladda upp filer: SSH, NFS, WebDav. WebDav verkar vara ett modernt och enkelt alternativ.

För WebDav kommer vi att använda Apache httpd. Varför Apache httpd 2020 och inte nginx?

Jag skulle vilja använda automatiserade verktyg för att bygga Nginx +-moduler (till exempel Webdav).

Det finns ett projekt för att bygga Nginx + moduler - nginx-byggare. Om du använder nginx + wevdav för att ladda upp filer behöver du en modul nginx-dav-ext-modul. När du försöker bygga och använda Nginx med nginx-dav-ext-modul genom nginx-byggare vi får ett fel Används av http_dav_module istället för nginx-dav-ext-module. Samma bugg stängdes på sommaren nginx: [emerg] okänt direktiv dav_methods.

Jag gjorde en pull-begäran Lägg till check git_url för inbäddad, refactored --with-{}_module и om modul == "http_dav_module" lägg till --med. Men de accepterades inte.

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>

Jag tror att du kommer att göra resten av Apache httpd-konfigurationen själv.

Nginx framför Apache httpd

Till skillnad från Apache använder Nginx en händelsebaserad modell för förfrågningsbehandling, vilket innebär att endast en HTTP-serverprocess krävs för ett valfritt antal klienter. Du kan använda nginx och minska serverbelastningen.

nginx-front.conf config. Jag tror att du kommer att göra resten av nginx-konfigurationen själv.

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

Ladda ner filer via WebDav

Att ladda ner rpm är väldigt enkelt.

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

Källa: will.com

Lägg en kommentar