In dit bericht bespreken we het opslaan van rpm-artifacten met een eenvoudig script met inotify + createrepo. Het uploaden van artifacten gebeurt via webdav met behulp van apache httpd. Waarom apache httpd later in dit bericht aan bod zal komen.
Het oplossing moet voldoen aan de volgende eisen voor het opzetten van alleen een RPM-opslagplaats:
Gratis
De beschikbaarheid van het pakket in de repository binnen enkele seconden na upload naar de opslageenheid.
Eenvoudig in te stellen en te onderhouden
De mogelijkheid om hoge beschikbaarheid (high availability) te realiseren
Waarom niet of :
Opslag in of meerdere soorten artifacten leidt ertoe dat of deze een enkelpunt van falen worden.
Hoge beschikbaarheid (high availability) in is betaald.
lijkt me een overcompliceerde oplossing.
Artifacten in worden opgeslagen in blob. Bij een onverwachte stroomuitval kun je de blob niet herstellen als je geen backup hebt. We hadden zo'n fout:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fout tijdens data lezen voor bestand 'privilege_5.pcl' 1e poging [java.io](http://java.io/).IOException: Slechte adres. Blob werd niet hersteld.
Broncode
ā De broncode bevindt zich
Het hoofdscript ziet er zo uit:
#!/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 &Installatie
Inotify-createrepo werkt alleen op CentOS 7 of hoger. Op CentOS 6 is het niet gelukt om het aan de praat te krijgen.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoConfiguratie
Standaard monitort inotify-createrepo de map /var/www/repos/rpm-repo/.
Je kunt deze map wijzigen in het bestand /etc/inotify-createrepo.conf.
Gebruik van
Bij het toevoegen van elk bestand in de map /var/www/repos/rpm-repo/ inotifywait zal een bestand aanmaken /tmp/need_create. De functie run_createrepo draait in een oneindige lus en monitort het bestand /tmp/need_create. Als het bestand bestaat, wordt createrepo --update.
Er verschijnt een vermelding in het bestand:
/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:00De mogelijkheid om hoge beschikbaarheid (high availability) te realiseren
Om hoge beschikbaarheid (high availability) van de bestaande oplossing te maken, denk ik dat je 2 servers kunt gebruiken, Keepalived voor HA en Lsyncd voor het synchroniseren van artifacten. is een daemon die veranderingen in de lokale map volgt, deze aggregeert, en na verloop van tijd start het rsync om deze te synchroniseren. Details en configuratie zijn beschreven in het bericht "".
WebDav
Bestanden kunnen op verschillende manieren worden geüpload: SSH, NFS, WebDav. WebDav lijkt een moderne en eenvoudige optie.
Voor WebDav gebruiken we Apache httpd. Waarom Apache httpd in 2020 en niet nginx?
Ik wil geautomatiseerde tools gebruiken voor het bouwen van Nginx + modules (bijvoorbeeld Webdav).
Er is een project voor het bouwen van Nginx + modules ā . Als je nginx + wevdav gebruikt om bestanden te uploaden, heb je de module nodig . Bij de poging om Nginx met met behulp van ontdekken we een fout . Een soortgelijke fout werd deze zomer gesloten .
Ik heb een Pull request gemaakt en . Maar ze hebben het niet aangenomen.
Configuratie 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 grantedDe overige configuratie van Apache httpd denk ik dat je zelf zult doen.
Nginx voor Apache httpd
In tegenstelling tot Apache gebruikt Nginx een gebeurtenisgerichte model voor het verwerken van verzoeken, waardoor ƩƩn HTTP-serverproces nodig is voor elk aantal clients. Je kunt nginx gebruiken om de belasting op de server te verlagen.
Configuratie nginx-front.conf. De overige configuratie van nginx denk ik dat je zelf zult doen.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name uw-virtuele-host;
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;
}
}Bestanden uploaden via WebDav
Het uploaden van rpm is heel eenvoudig.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://uw-virtuele-host/rpm/Bron: habr.com
