Référentiel rpm simple utilisant Inotify et webdav

Dans cet article, nous examinerons un référentiel d'artefacts rpm à l'aide d'un simple script inotify + createrepo. Les artefacts sont téléchargés via webdav en utilisant apache httpd. Pourquoi apache httpd sera écrit vers la fin du message.

Ainsi, la solution doit répondre aux exigences suivantes pour organiser uniquement le stockage RPM :

  • Libre

  • Disponibilité du package dans le référentiel quelques secondes après le téléchargement dans le référentiel d'artefacts.

  • Facile à installer et à entretenir

  • Capacité à faire de la haute disponibilité

    Pourquoi pas SonaType Nexus ou Pâte à papier:

  • Stockage dans SonaType Nexus ou Pâte à papier de nombreux types d'artefacts conduit au fait que SonaType Nexus ou Pâte à papier devenir un point de défaillance unique.

  • Haute disponibilité dans SonaType Nexus est payé.

  • Pâte à papier Cela me semble être une solution trop sophistiquée.

  • Artefacts dans SonaType Nexus stocké dans blob. En cas de coupure de courant soudaine, vous ne pourrez pas restaurer le blob si vous n'avez pas de sauvegarde. Nous avons eu cette erreur : ERROR [ForkJoinPool.commonPool-worker-2] *SYSTEM [com.orientechnologies.orient.core.storage](http://com.orientechnologies.orient.core.storage/).fs.OFileClassic - $ANSI{green {db=security}} Error during data read for file 'privilege_5.pcl' 1-th attempt [java.io](http://java.io/).IOException: Bad address. Blob n'a jamais été récupéré.

Code source

→ Le code source se trouve ici

Le script principal ressemble à ceci :

#!/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 ne fonctionne que sur CentOS 7 ou supérieur. Impossible de le faire fonctionner sur CentOS 6.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/inotify-createrepo
yum -y install inotify-createrepo
systemctl start inotify-createrepo

Configuration

Par défaut, inotify-createrepo surveille un répertoire /var/www/repos/rpm-repo/.

Vous pouvez changer ce répertoire dans le fichier /etc/inotify-createrepo.conf.

l'utilisation de

Lors de l'ajout d'un fichier à un répertoire /var/www/repos/rpm-repo/ inotifywait créera un fichier /tmp/need_create. La fonction run_createrepo s'exécute dans une boucle infinie et surveille le fichier /tmp/need_create. Si le fichier existe, exécutez createrepo --update.

Une entrée apparaîtra dans le fichier :

/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:00

Capacité à faire de la haute disponibilité

Pour rendre la haute disponibilité d'une solution existante, je pense que vous pouvez utiliser 2 serveurs, Keepalived pour HA et Lsyncd pour la synchronisation des artefacts. Lsyncd - un démon qui surveille les changements dans le répertoire local, les agrège, et après un certain temps, rsync commence à les synchroniser. Les détails et les paramètres sont décrits dans le post "Synchronisation rapide d'un milliard de fichiers".

WebDav

Il existe plusieurs façons de télécharger des fichiers : SSH, NFS, WebDav. WebDav semble être une option moderne et simple.

Pour WebDav, nous utiliserons Apache httpd. Pourquoi Apache httpd en 2020 et pas nginx ?

Je souhaite utiliser des outils automatisés pour créer des modules Nginx + (par exemple, Webdav).

Il existe un projet de construction de modules Nginx + - nginx-builder. Si vous utilisez nginx + wevdav pour télécharger des fichiers, vous avez besoin d'un module nginx-dav-ext-module. Lorsque vous essayez de créer et d'utiliser Nginx avec nginx-dav-ext-module au moyen de nginx-builder nous aurons une erreur Utilisé par http_dav_module au lieu de nginx-dav-ext-module. Le même bogue a été fermé en été nginx : [emerg] directive inconnue dav_methods.

J'ai fait une pull request Ajouter check git_url pour le --with-{}_module intégré et refactorisé и si module == "http_dav_module" ajouter --avec. Mais ils n'ont pas été acceptés.

configuration webdav.conf

DavLockDB /var/www/html/DavLock
<VirtualHost localhost:80>
    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
    <Directory /var/www/repos/rpm-repo>
        DAV On
        Options Indexes FollowSymlinks SymLinksifOwnerMatch IncludesNOEXEC
        IndexOptions NameWidth=* DescriptionWidth=*
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

Je pense que vous ferez vous-même le reste de la configuration d'Apache httpd.

Nginx devant Apache httpd

Contrairement à Apache, Nginx utilise un modèle de traitement des demandes basé sur les événements, ce qui signifie qu'un seul processus de serveur HTTP est requis pour un nombre quelconque de clients. Vous pouvez utiliser nginx et réduire la charge du serveur.

configuration nginx-front.conf. Je pense que vous ferez vous-même le reste de la configuration de nginx.

upstream nginx_front {
    server localhost:80;
}

server {
    listen 443 ssl;
    server_name ваш-виртуальных-хост;
    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;
    }
}

Téléchargement de fichiers via WebDav

Le téléchargement de rpm est très facile.

curl -T ./nginx-1.16.1-1.el7.ngx.x86_64.rpm https://ваш-виртуальный-хост/rpm/

Source: habr.com

Ajouter un commentaire