In questo post esamineremo lo storage degli artefatti RPM utilizzando un semplice script con inotify + createrepo. Il caricamento degli artefatti avviene tramite WebDAV utilizzando Apache HTTPD. Perché Apache HTTPD sarà menzionato più avanti nel post.
Quindi, la soluzione deve soddisfare i seguenti requisiti per l'organizzazione di uno storage RPM:
Gratuito
Disponibilità del pacchetto nel repository entro pochi secondi dal caricamento nello storage degli artefatti.
Semplice da installare e mantenere
Possibilità di implementare alta disponibilità (high availability)
Perché non o :
Lo storage di o diversi tipi di artefatti porta a o diventare un unico punto di fallimento.
L'alta disponibilità (high availability) in è a pagamento.
Mi sembra una soluzione eccessivamente complessa.
Gli artefatti in vengono memorizzati in blob. In caso di interruzione improvvisa dell'elettricità, non potrai ripristinare il blob se non hai un backup. Abbiamo avuto un errore del genere:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Errore durante la lettura dei dati per il file 'privilege_5.pcl' 1ª tentativo [java.io](http://java.io/).IOException: Indirizzo errato. Il blob non è stato recuperato.
Codice sorgente
→ Il codice sorgente si trova
Lo script principale appare così:
#!/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 &Installazione
Inotify-createrepo funziona solo su CentOS 7 o superiore. Non è riuscito a farlo funzionare su CentOS 6.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoConfigurazione
Per impostazione predefinita inotify-createrepo monitora la directory /var/www/repos/rpm-repo/.
Questa directory può essere modificata nel file /etc/inotify-createrepo.conf.
Utilizzo
Quando viene aggiunto un file alla directory /var/www/repos/rpm-repo/ inotifywait genererà un file /tmp/need_create. La funzione run_createrepo viene eseguita in un ciclo infinito e monitora il file /tmp/need_create. Se il file esiste, viene eseguito createrepo --update.
Nel file apparirà una voce:
/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:00Possibilità di implementare alta disponibilità (high availability)
Per creare alta disponibilità (high availability) da una soluzione esistente, penso si possano usare 2 server, Keepalived per HA e Lsyncd per la sincronizzazione degli artefatti. — un demone che monitora le modifiche nella directory locale, le aggrega e dopo un certo periodo di tempo avvia rsync per la loro sincronizzazione. Dettagli e configurazione sono descritti nel post "".
WebDAV
I file possono essere caricati in diversi modi: SSH, NFS, WebDAV. WebDAV sembra un'opzione moderna e semplice.
Per WebDAV useremo Apache HTTPD. Perché Apache HTTPD nel 2020, invece di Nginx?
Si vuole utilizzare strumenti automatizzati per costruire Nginx + moduli (ad esempio, WebDAV).
C'è un progetto per assemblare Nginx + moduli — . Se si utilizza nginx + wevdav per il caricamento di file, è necessario il modulo . Quando proviamo ad assemblare e utilizzare Nginx con con l'aiuto riceveremo un errore . Lo stesso errore è stato risolto in estate .
Ho fatto una Pull request e . Ma non è stata accettata.
Configurazione 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 grantedPenso che il resto della configurazione di Apache httpd lo farete voi.
Nginx prima di Apache httpd
A differenza di Apache, Nginx utilizza un modello basato su eventi per gestire le richieste, quindi è necessario solo un processo HTTP-server per qualsiasi numero di clienti. Puoi utilizzare nginx e ridurre il carico sul server.
Configurazione nginx-front.conf. Penso che il resto della configurazione di nginx lo farete voi.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name il_tuo_host_virtuale;
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;
}
}Caricamento di file tramite WebDav
Il caricamento di rpm è molto semplice.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://il_tuo_host_virtuale/rpm/Fonte: habr.com
