In diesem Beitrag betrachten wir die Speicherung von RPM-Artefakten mit einem einfachen Skript unter Verwendung von inotify + createrepo. Das Hochladen der Artefakte erfolgt über WebDAV mit Apache httpd. Warum Apache httpd verwendet wird, wird näher am Ende des Beitrags erläutert.
Daher muss die Lösung folgende Anforderungen für die Organisation eines reinen RPM-Speichers erfüllen:
Kostenlos
Verfügbarkeit des Pakets im Repository innerhalb von Sekunden nach dem Hochladen in den Artefaktespeicher.
Einfach zu installieren und zu warten
Möglichkeit zur Schaffung hoher Verfügbarkeit (High Availability)
Warum nicht oder :
Die Speicherung in oder vielen Arten von Artefakten führt dazu, dass oder eine einzige Fehlerstelle entsteht.
Hohe Verfügbarkeit (High Availability) in ist kostenpflichtig.
Ich halte es für eine übermäßig komplizierte Lösung.
Artefakte in werden in einem Blob gespeichert. Bei plötzlichem Stromausfall können Sie das Blob nicht wiederherstellen, wenn Sie kein Backup haben. Wir hatten einen solchen Fehler:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Fehler beim Datenlesen für die Datei 'privilege_5.pcl' 1. Versuch [java.io](http://java.io/).IOException: Schlechte Adresse. Das Blob konnte nicht wiederhergestellt werden.
Quellcode
→ Der Quellcode befindet sich
Das Hauptskript sieht folgendermaßen aus:
#!/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 funktioniert nur auf CentOS 7 oder höher. Auf CentOS 6 konnte ich es nicht zum Laufen bringen.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoKonfiguration
Standardmäßig überwacht inotify-createrepo das Verzeichnis /var/www/repos/rpm-repo/.
Dieses Verzeichnis kann in der Datei geändert werden. /etc/inotify-createrepo.conf.
Verwendung
Beim Hinzufügen einer Datei in das Verzeichnis /var/www/repos/rpm-repo/ wird inotifywait eine Datei erstellen /tmp/need_create. Die Funktion run_createrepo läuft in einer Endlosschleife und überwacht die Datei /tmp/need_create. Wenn die Datei existiert, wird createrepo --update.
in der Datei ein Eintrag erscheinen:
/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:00Möglichkeit zur Schaffung hoher Verfügbarkeit (High Availability)
Um hohe Verfügbarkeit (High Availability) aus der bestehenden Lösung zu schaffen, denke ich, dass man zwei Server, Keepalived für HA und Lsyncd für die Synchronisierung der Artefakte verwenden kann. ist ein Daemon, der Änderungen im lokalen Verzeichnis überwacht, sie aggregiert und nach einer bestimmten Zeit rsync für die Synchronisierung startet. Details und Konfiguration sind im Beitrag "".
WebDav
Dateien können auf mehreren Wegen hochgeladen werden: SSH, NFS, WebDav. WebDav scheint eine moderne und einfache Option zu sein.
Für WebDav verwenden wir Apache httpd. Warum Apache httpd im Jahr 2020 und nicht nginx?
Es werden automatisierte Mittel zur Erstellung von Nginx + Modulen (z. B. Webdav) gewünscht.
Es gibt ein Projekt zur Erstellung von Nginx + Modulen — . Wenn Nginx + Webdav zum Hochladen von Dateien verwendet wird, wird das Modul benötigt . Bei dem Versuch, Nginx mit mit Hilfe von erhalten wir einen Fehler . Ein ähnlicher Fehler wurde im Sommer geschlossen .
Ich habe einen Pull-Request gemacht und . Aber sie wurden nicht angenommen.
Webdav.conf Konfiguration
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 grantedDie restliche Apache httpd Konfiguration denke ich, werden Sie selbst erledigen.
Nginx vor Apache httpd
Im Gegensatz zu Apache verwendet Nginx ein ereignisbasiertes Modell zur Bearbeitung von Anfragen, wodurch nur ein HTTP-Server-Prozess für beliebig viele Clients erforderlich ist. Sie können Nginx verwenden und die Last auf dem Server reduzieren.
Konfiguration nginx-front.conf. Die restliche Nginx-Konfiguration denke ich, werden Sie selbst erledigen.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name Ihr-virtueller-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;
}
}Dateien über WebDav hochladen
Das Hochladen von RPM ist sehr einfach.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://Ihr-virtueller-Host/rpm/Quelle: habr.com
