cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu
đŸ˜€ Ce billet a Ă©tĂ© Ă©ditĂ© le : 2023-04-06

La commande rsync est incontournable dans la mise en place des sauvegardes. Une autre fonctionnalitĂ© incontournable est l’utilisation du cron pour automatiser le lancement du « backup ».

Le cas d’usage Ă©tant souvent quelque chose qui tourne ne tourne pas directement sur votre machine, mais sur un serveur et qui va effectuer une sauvegarde sur une troisiĂšme machine. GĂ©nĂ©ralement tous cela se passe donc Ă  distance hors d’une surveillance directe.

Si vous avez testĂ© la commande rsync avec succĂšs en utilisant le mĂȘme utilisateur et les mĂȘmes paramĂštres que dans le cron, votre problĂšme est plus certainement liĂ© au cron (et Ă  son environnement) qu’à la commande rsync.

Voici quelques Ă©cueils que vous pourrez rencontrer et comment les Ă©viter.


ඏ

La commande « rsync »

L’avantage de rsync est sa vitesse d’exĂ©cution d’une part et le fait qu’il soit basĂ© sur ssh d’autre part. rsync permet de faire des copies de dossiers (d’arborescences) entre 2 machines (notĂ© que ce dernier point est une possibilitĂ©, pas une obligation, rsync pouvant ĂȘtre utilisĂ© en local).

Par exemple :

rsync --archive --compress --delete --links --progress --recursive --times --update --verbose -vv /var/www/nextcloud/ admin@192.168.10.221:/share/homes/backups/nextcloud-backup/

ඏ

La commande « crontab »

La commande crontab permet de manipuler le planificateur de tĂąches qui a le doux nom de cron.

Les principaux usages de crontab :

Syntaxe Description
crontab -l Affiche le contenu du fichier crontab de l’utilisateur courant
crontab -r Supprime toutes les actions du fichier crontab de l’utilisateur courant
crontab -e Édite les actions du fichier crontab de l’utilisateur courant

Pour afficher le contenu du fichier crontab d’un autre utilisateur (par exemple : www-data), utiliser sudo :

sudo -u www-data crontab -l

Une action de cron typique ressemble à cela :

*/5 * * * * COMMAND

Le format est le suivant :

minute hour jour du mois mois jour de la semaine commande à exécuter

Par exemple :

*/5 * * * * /usr/local/bin/mybackup.sh >>/var/log/apps/mybackup-from-cron.log 2>&1

Pour vous aider à générer la partie date vous pouvez utiliser crontab guru.


ඏ

« ssh » ou ces dérivés et le « cron »

Lors de la mise au point d’un script utilisant directement ou indirectement ssh (indirectement comme rsync, rcp — qui est obsolùte depuis 2019, sftp)

Pensez Ă  dĂ©sactiver l’auto-ban, s’il existe, sur le serveur cible le temps de la mise au point. Ceci s’adresse tout particuliĂšrement aux NAS qui intĂšgrent souvent ce type de mĂ©canisme par dĂ©faut.

En cas d’une sĂ©rie d’échec de connexion, la machine qui tente de se connecter est bannie, ruinant vos tentatives de rĂ©paration du script, voir mĂȘme vous Ă©loignant de la solution.


ඏ

Les particularités du « cron »

L’utilisation de taches avec le cron diffĂ©rent d’un appel depuis un terminal ou d’une session ssh :

Les variables $HOME et $USER :

Suivant le cas ces variables ne sont pas initialisĂ©es depuis le cron, si vous en avez besoin, le plus simple est de les tester en dĂ©but de script et Ă©ventuellement de les initialiser vous-mĂȘme comme suit :

if [ -z "${USER:-}" ] ; then
  USER="$( id -un )"
fi
declare -gx USER # Rend la variable globale et l’exporte

Pour la variable $HOME, on doit s’appuyer sur la variable $USER :

Attention, la solution simpliste suivante ne fonctionne pas au moins pour les utilisateurs systĂšmes comme www-data:

HOME="/home/${USER}"

Une solution plus universelle consiste à s’appuyer sur /etc/passwd et sur la variable $USER :

if [ -z "${HOME:-}" ] ; then
  HOME="$( grep "^${USER}:" /etc/passwd | cut -d':' -f6 )"
fi
declare -gx HOME # Rend la variable globale et l’exporte

  • Remarque

    La remarque ci-dessous ne s’applique pas nĂ©cessairement Ă  tous les Linux, ni Ă  toutes leur version, cela Ă©tant cette prĂ©caution n’a pas d’effet nĂ©gatif.

    Vous noterez que j’ai mis la dĂ©claration globale et l’export en dehors du if 
 fi, la raison est que lĂ  encore l’environnement du cron se distingue, certaines variables n’ont pas le drapeau « exporté » actif. Certaines commandes ne prennent en compte que les variables exportĂ©es, c’est le cas en particulier de : envsubst.


Un shell limité

Le shell utilisĂ© par le cron est sh, pour contourner cela vous devez prĂ©ciser le shell dans la ligne de commande ou mieux appeler un script, qui vous permettra d’initialiser vos variables.

Pour ma part, je conseille la crĂ©ation d’un script dans presque tous les cas d’usage.


La redirection

*/5 * * * * /usr/local/bin/mybackup.sh >>/var/log/apps/mybackup-from-cron.log 2>&1

Un petit piĂšge avec la redirection est qu’il faut s’assurer que l’utilisateur dĂ©fini par le cron ait bien le droit d’écrire le log. Une remarque qui peut sembler Ă©vidente, mais si le fichier de redirection ne peut pas ĂȘtre crĂ©Ă© ou modifier, la tache Ă©chouera en silence.


ඏ

Les croches pieds avec « rsync » et « ssh » en général

  • Le transfert d’agent SSH ou « SSH agent forwarding »

Cette fonctionnalitĂ© n’est gĂ©nĂ©ralement pas active par dĂ©faut, mais elle offre quelques avantages et vous l’avez peut-ĂȘtre activĂ©e volontairement ou au dĂ©tour d’un tutoriel


Le transfert d’agent SSH

Sur un petit rĂ©seau, on utilisera le transfert d’agent SSH pour que la clĂ© prĂ©sente sur votre machine (machine administrateur) puisse ĂȘtre rĂ©utilisĂ©e lors du transfert du serveur applicatif vers le serveur de sauvegarde.

Cela implique que la commande de sauvegarde soit lancée depuis une session ssh, et donc cela ne fonctionnera pas depuis le cron.

Le transfert d’agent SSH dans le cadre professionel

Dans un milieu professionnel on pourra utiliser le transfert d’agent SSH dans le cadre d’un bastion.

Ici la machine de l’administrateur n’est pas sur le mĂȘme rĂ©seau que les serveurs. Seul la machine bastion a accĂšs aux deux rĂ©seaux.

LĂ  le transfert d’agent SSH prend tout son sens, puisque cela permet de ne pas stocker de clĂ©s sur le bastion.

Les cas d'echec de connexion produisent un erreur du type:

opening connection using: ssh -l admin 192.168.10.221 rsync --server -vvvulogDtprze --delete . /share/homes/backups/nextcloud-backup/config
Permission denied, please try again.
Permission denied, please try again.
admin@192.168.10.221: Permission denied (publickey,password,keyboard-interactive).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
[sender] _exit_cleanup(code=12, file=io.c, line=228): about to call exit(255)

ඏ

Diagnostic du « cron »

Pour voir ce qu’il se passe autour du cron, vous pouvez utiliser l’une des commandes suivantes :

La version systemd (la maniùre actuelle/“moderne”) :

journalctl --unit cron.service

Vous pouvez obtenir cette ligne de commande à l’aide de : jour<TAB>--uni<TAB>cr<TAB>

La version historique qui peut ne pas fonctionner sur certain Linux :

grep CRON /var/log/syslog

Un type d’erreur dans le cron indique que le diagnostic n’est pas rĂ©ellement possible :

Mar 30 07:40:01 TheHostName CRON[17671]: (CRON) info (No MTA installed, discarding output)

En français : « Aucun agent de transfert de courrier installé, suppression de la sortie »

Cela arrive dans le cas oĂč la sortie est redirigĂ©e vers les mails. Un sujet Ă  part entiĂšre trop complexe pour l’aborder dans ce billet. ConcrĂštement, il s’agit d’installer un service smtp comme postfix, exim4, ssmtp (facile mais qui n’est plus maintenu), msmtp (simple) ou OpenSMTPD.


ඏ

Liens

኿


â„č 2006 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog