I dette indlæg vil vi se på lageret af rpm-artifakter ved hjælp af et simpelt script med inotify + createrepo. Uploaden af artifakter sker via webdav ved brug af apache httpd. Hvorfor apache httpd vil blive nævnt nær slutningen af indlægget.
Så løsningen skal opfylde følgende krav for at organisere et rent RPM-lager:
Gratis
Tilgængeligheden af pakken i depotet inden for få sekunder efter upload til lageret af artifakter.
Nem at installere og vedligeholde
Mulighed for at skabe høj tilgængelighed (high availability)
Hvorfor ikke eller :
Lageret i eller mange typer artifakter fører til, at eller bliver et enkelt punkt af svigt.
Høj tilgængelighed (high availability) i er betalt.
jeg synes det ser ud til at være en overkompliceret løsning.
Artifakter i opbevares i blob. Ved pludselig strømafbrydelse vil du ikke kunne gendanne blob, medmindre du har en backup. Vi havde en sådan fejl:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fejl under data læsning for fil 'privilege_5.pcl' 1. forsøg [java.io](http://java.io/).IOException: Bad address. Blob blev aldrig gendannet.
Kildekode
→ Kildekoden ligger
Det primære script ser sådan ud:
#!/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 fungerer kun på CentOS 7 eller derover. På CentOS 6 kunne jeg ikke få det til at fungere.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoKonfiguration
Som standard overvåger inotify-createrepo mappen /var/www/repos/rpm-repo/.
Denne mappe kan ændres i filen /etc/inotify-createrepo.conf.
Brugen af
Når en hvilken som helst fil tilføjes til mappen /var/www/repos/rpm-repo/ inotifywait vil oprette en fil /tmp/need_create. Funktionen run_createrepo kører i en uendelig løkke og overvåger filen /tmp/need_create. Hvis filen findes, vil der blive startet createrepo --update.
I filen vil der blive tilføjet en post:
/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:00Mulighed for at skabe høj tilgængelighed (high availability)
For at skabe høj tilgængelighed (high availability) fra den eksisterende løsning, synes jeg, at det ville være muligt at bruge 2 servere, Keepalived til HA og Lsyncd til synkronisering af artifakter. — en demon, der overvåger ændringer i den lokale mappe, aggregerer dem, og efter et vist tidsrum starter rsync for deres synkronisering. Detaljer og opsætning er beskrevet i indlægget "".
WebDav
Filer kan uploades på flere måder: SSH, NFS, WebDav. WebDav virker som en moderne og enkel løsning.
Til WebDav vil vi bruge Apache httpd. Hvorfor Apache httpd i 2020 og ikke nginx?
Det er ønskeligt at bruge automatiserede værktøjer til at bygge Nginx + moduler (f.eks. Webdav).
Der er et projekt til at bygge Nginx + moduler — . Hvis man bruger nginx + wevdav til at uploade filer, så er modulet nødvendigt . Ved forsøg på at samle og bruge Nginx med ved hjælp af får vi en fejl . Den samme fejl blev løst om sommeren .
Jeg lavede en Pull request og . Men de accepterede ikke dem.
Konfigurationsfil webdav.conf
DavLockDB /var/www/html/DavLock
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
DAV On
Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
IndexOptions NameWidth=* DescriptionWidth=*
AllowOverride none
Require all grantedDen øvrige konfiguration af Apache httpd tror jeg, du vil klare selv.
Nginx før Apache httpd
I modsætning til Apache bruger Nginx en begivenhedsmæssig model til behandlingen af anmodninger, hvilket betyder, at der kun kræves én HTTP-serverproces til ethvert antal klienter. Du kan bruge nginx og mindske belastningen på serveren.
Konfiguration nginx-front.conf. Den øvrige konfiguration af nginx tror jeg, du vil klare selv.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name din-virtuelle-vært;
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;
}
}Upload af filer gennem WebDav
Upload af rpm er meget enkel.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://din-virtuelle-vært/rpm/Kilde: habr.com
