En este post, exploraremos el almacenamiento de artefactos RPM utilizando un simple script con inotify + createrepo. La carga de artefactos se realiza a través de WebDAV utilizando Apache HTTPD. Por qué se mencionará Apache HTTPD más adelante en el post.
Por lo tanto, la solución debe cumplir con los siguientes requisitos para establecer un repositorio solo de RPM:
Gratis
Disponibilidad del paquete en el repositorio en unos segundos después de la carga en el almacenamiento de artefactos.
Fácil de instalar y mantener
Posibilidad de lograr alta disponibilidad (high availability)
Por qué no o :
Almacenar en o muchos tipos de artefactos provoca que o se conviertan en un único punto de falla.
La alta disponibilidad (high availability) en es de pago.
me parece una solución innecesariamente complicada.
Los artefactos en se almacenan en blob. Con un apagón repentino, no podrá recuperar el blob a menos que tenga una copia de seguridad. Tuvimos un error así:
ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Error durante la lectura de datos para el archivo 'privilege_5.pcl' 1ª intento [java.io](http://java.io/).IOException: Dirección incorrecta. El blob no se recuperó.
Código fuente
→ El código fuente se encuentra en
El script principal se ve así:
#!/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 &Instalación
Inotify-createrepo solo funciona en CentOS 7 o superior. No hemos podido hacerlo funcionar en CentOS 6.
yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepoConfiguración
De forma predeterminada, inotify-createrepo monitorea el directorio /var/www/repos/rpm-repo/.
Este directorio se puede cambiar en el archivo /etc/inotify-createrepo.conf.
Uso
Al añadir cualquier archivo en el directorio /var/www/repos/rpm-repo/ inotifywait creará un archivo /tmp/need_create. La función run_createrepo se ejecuta en un bucle infinito y monitorea el archivo /tmp/need_create. Si el archivo existe, se ejecuta createrepo --update.
Aparecerá una entrada en el archivo:
/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:00Posibilidad de lograr alta disponibilidad (high availability)
Para lograr alta disponibilidad (high availability) a partir de una solución existente, creo que se pueden utilizar 2 servidores, Keepalived para HA y Lsyncd para sincronizar los artefactos. — un demonio que supervisa los cambios en un directorio local, los agrega y, después de un cierto tiempo, inicia rsync para sincronizarlos. Los detalles y la configuración están descritos en el post "".
WebDav
Los archivos se pueden cargar de varias maneras: SSH, NFS, WebDav. WebDav parece una opción moderna y simple.
Para WebDav, utilizaremos Apache HTTPD. ¿Por qué Apache HTTPD en 2020 y no Nginx?
Quiero usar herramientas automatizadas para construir Nginx + módulos (por ejemplo, WebDAV).
Hay un proyecto para ensamblar Nginx + módulos — . Si usamos nginx + wevdav para subir archivos, necesitamos el módulo . Al intentar compilar y usar Nginx con con obtendremos un error . Se cerró un error similar en verano .
Hice un Pull request y . Pero no los aceptaron.
Configuración 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 grantedCreo que harás la otra configuración de Apache httpd por tu cuenta.
Nginx antes de Apache httpd
A diferencia de Apache, Nginx utiliza un modelo de eventos para el procesamiento de solicitudes, lo que significa que se necesita solo un proceso del servidor HTTP para cualquier número de clientes. Puedes usar nginx y reducir la carga en el servidor.
Configuración nginx-front.conf. Creo que harás la otra configuración de nginx por tu cuenta.
upstream nginx_front {
server localhost:80;
}
server {
listen 443 ssl;
server_name tu-host-virtual;
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;
}
}Carga de archivos a través de WebDav
La carga de rpm es muy simple.
curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://tu-host-virtual/rpm/Fuente: habr.com
