Yksinkertainen rpm-arkisto Inotifyn ja webdavin avulla

Tässä viestissä tarkastelemme rpm-artefaktivarastoa käyttämällä yksinkertaista inotify + Createrepo -komentosarjaa. Artefaktit ladataan webdavin kautta käyttämällä apache httpd:tä. Miksi apache httpd kirjoitetaan viestin lopussa.

Joten ratkaisun on täytettävä seuraavat vaatimukset vain RPM-tallennustilan järjestämiseksi:

  • ilmaiseksi

  • Paketin saatavuus arkistossa muutaman sekunnin kuluttua siitä, kun se on ladattu artefaktiarkistoon.

  • Helppo asentaa ja huoltaa

  • Kyky tehdä korkea saatavuus

    Miksi ei SonaType Nexus tai Massa:

  • Säilytys sisään SonaType Nexus tai Massa monen tyyppiset esineet johtavat siihen tosiasiaan SonaType Nexus tai Massa tulla yhdeksi epäonnistumispisteeksi.

  • Korkea saatavuus sisään SonaType Nexus on maksettu.

  • Massa Vaikuttaa minusta ylisuunniteltulta ratkaisulta.

  • Artefaktit sisään SonaType Nexus tallennettu blobiin. Äkillisen sähkökatkon sattuessa et voi palauttaa blobia, jos sinulla ei ole varmuuskopiota. Meillä oli tämä virhe: 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. Blobia ei koskaan saatu takaisin.

Lähdekoodi

→ Lähdekoodi löytyy täällä

Pääskripti näyttää tältä:

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

Asennus

inotify-createrepo toimii vain CentOS 7:ssä tai uudemmassa. Sitä ei saatu toimimaan CentOS 6:ssa.

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

Kokoonpano

Oletuksena inotify-createrepo valvoo hakemistoa /var/www/repos/rpm-repo/.

Voit muuttaa tätä hakemistoa tiedostossa /etc/inotify-createrepo.conf.

Käyttää

Kun lisäät minkä tahansa tiedoston hakemistoon /var/www/repos/rpm-repo/ inotifywait luo tiedoston /tmp/need_create. Run_createrepo-funktio toimii äärettömässä silmukassa ja valvoo tiedostoa /tmp/need_create. Jos tiedosto on olemassa, suorita se createrepo --update.

Tiedostoon tulee merkintä:

/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

Kyky tehdä korkea saatavuus

Jotta olemassa olevasta ratkaisusta saataisiin korkea käytettävyys, mielestäni voit käyttää kahta palvelinta, Keepalived for HA ja Lsyncd artefaktien synkronointiin. Lsyncd - Daemon, joka tarkkailee muutoksia paikallisessa hakemistossa, kokoaa ne yhteen ja tietyn ajan kuluttua rsync alkaa synkronoida niitä. Yksityiskohdat ja asetukset on kuvattu postauksessa "Miljardin tiedoston nopea synkronointi".

WebDav

Tiedostojen lataamiseen on useita tapoja: SSH, NFS, WebDav. WebDav näyttää olevan moderni ja yksinkertainen vaihtoehto.

WebDavissa käytämme Apache httpd:tä. Miksi Apache httpd vuonna 2020 eikä nginx?

Haluaisin käyttää automatisoituja työkaluja Nginx + -moduulien rakentamiseen (esimerkiksi Webdav).

On olemassa projekti Nginx + -moduulien rakentamiseksi - nginx-rakennusohjelma. Jos käytät nginx + wevdav tiedostojen lataamiseen, tarvitset moduulin nginx-dav-ext-moduuli. Kun yrität rakentaa ja käyttää Nginxiä nginx-dav-ext-moduuli keinoin nginx-rakennusohjelma saamme virheilmoituksen Käyttää http_dav_module nginx-dav-ext-module sijaan. Sama vika suljettiin kesällä nginx: [emerg] tuntematon direktiivi dav_methods.

Tein vetopyynnön Lisää tarkistus git_url upotetun, uudelleenmuodostetun --with-{}_moduulin varalta и if module == "http_dav_module" append --with. Mutta niitä ei hyväksytty.

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>

Luulen, että teet loput Apache httpd -määritykset itse.

Nginx Apachen edessä httpd

Toisin kuin Apache, Nginx käyttää tapahtumapohjaista pyyntöjenkäsittelymallia, mikä tarkoittaa, että vain yksi HTTP-palvelinprosessi vaaditaan mille tahansa määrälle asiakkaita. Voit käyttää nginxiä ja vähentää palvelimen kuormitusta.

nginx-front.conf config. Luulen, että teet loput nginx-asetukset itse.

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

Tiedostojen lataaminen WebDavin kautta

RPM-lataus on erittäin helppoa.

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

Lähde: will.com

Lisää kommentti