V tomto příspěvku se budeme věnovat úložišti RPM artefaktů pomocí jednoduchého skriptu s inotify + createrepo. Nahrávání artefaktů se provádí prostřednictvím WebDAV s použitím Apache HTTPD. Proč bude Apache HTTPD popsáno blíže ke konci příspěvku.
Takže řešení by mělo splňovat následující požadavky pro organizaci pouze RPM úložiště:
Zdarma
Dostupnost balíčku v repozitáři během několika sekund po nahrání do úložiště artefaktů.
Jednoduché na instalaci a údržbu
Možnost vytvořit vysokou dostupnost (high availability)
Proč ne nebo :
Úložiště v nebo mnohých typech artefaktů vede k tomu, že nebo se stávají jediným bodem selhání.
Vysoká dostupnost (high availability) v je placená.
připadá mi jako příliš složité řešení.
Artefakty v jsou uloženy v blobu. Při náhlém výpadku elektrického proudu nebudete schopni obnovit blob, pokud nemáte zálohu. Měli jsme takovou chybu:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Chyba při čtení dat pro soubor 'privilege_5.pcl' 1. pokus [java.io](http://java.io/).IOException: Špatná adresa. Blob nebyl obnoven.
Zdrojový kód
→ Zdrojový kód se nachází
Hlavní skript vypadá takto:
#!/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 &Instalace
Inotify-createrepo funguje pouze na CentOS 7 a vyšších. Na CentOS 6 se ho nepodařilo rozchodit.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoKonfigurace
Ve výchozím nastavení inotify-createrepo monitoruje adresář /var/www/repos/rpm-repo/.
Tento adresář lze změnit v souboru /etc/inotify-createrepo.conf.
Použití
Při přidání jakéhokoli souboru do adresáře /var/www/repos/rpm-repo/ inotifywait vytvoří soubor /tmp/need_create. Funkce run_createrepo se spouští v nekonečné smyčce a monitoruje soubor /tmp/need_create. Pokud soubor existuje, spustí se createrepo --update.
V souboru se objeví záznam:
/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:00Možnost vytvořit vysokou dostupnost (high availability)
Abychom zajistili vysokou dostupnost (high availability) z existujícího řešení, myslím, že lze použít 2 servery, Keepalived pro HA a Lsyncd pro synchronizaci artefaktů. — démon, který sleduje změny v místním adresáři, agreguje je, a po určitém čase spouští rsync pro jejich synchronizaci. Podrobnosti a nastavení jsou popsány v příspěvku "".
WebDav
Soubory lze nahrávat několika způsoby: SSH, NFS, WebDav. WebDav se jeví jako moderní a jednoduchá varianta.
Pro WebDav budeme používat Apache HTTPD. Proč Apache HTTPD v roce 2020, a ne Nginx?
Chci využít automatizované nástroje pro sestavení Nginx + moduly (například Webdav).
Existuje projekt na sestavení Nginx + moduly — . Pokud použijete nginx + wevdav pro nahrávání souborů, potřebujete modul . Při pokusu o sestavení a použití Nginx s pomocí obdržíme chybu . Stejná chyba byla vyřešena v létě .
Udělal jsem Pull request a . Ale nebyli přijati.
Konfigurační soubor 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 grantedOstatní nastavení Apache httpd si myslím, že uděláte sami.
Nginx před Apache httpd
Na rozdíl od Apache, Nginx používá událostní model zpracování požadavků, díky čemuž je pro libovolný počet klientů potřeba pouze jeden proces HTTP serveru. Můžete použít nginx a snížit zátěž serveru.
Konfigurace nginx-front.conf. Ostatní nastavení nginx si myslím, že uděláte sami.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name váš-virtuální-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;
}
}Nahrávání souborů přes WebDav
Nahrávání rpm je velmi jednoduché.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://váš-virtuální-host/rpm/Zdroj: habr.com
