tech:exemple_de_script_rsync_d_envoie_de_fichiers_via_ssh
Ceci est une ancienne révision du document !
Table des matières
Exemple de script rsync d'envoie de fichiers via SSH - pushlogs
QQOQCP
Quoi:
- Envoie de fichiers logs des composants suivants : xxx01, xxx02
Où:
- Le serveur destinataire est un serveur SFTP (SSH) renseigné dans le fichier pushlogs.env
- La liste des fichiers à envoyer est défine dans le fichier pushlogs.lst
Quand:
- Définie dans le(s) crontab de l'utilisateur(s) propriétaire des fichiers
- Normalement il s'agit de l'utilisateur 'plopuser'
Qui:
- Auteur: JBL
- Pour: ACME
Comment:
- Une crontab de l'utilsateur 'plopuser' (ou autre) appelle le script bash pushlogs.sh
- pushlogs.sh utilise la commande rsync en utilisant le protocole SSH
- L'authentification se fait par clef SSH (RSA 4096)
- pushlogs.sh va lire le fichier .pushlogs.env et .pushlogs.lst présent à la racine du HOMEDIR
Prérequis
- Les commandes suivants doivent être présentes : rsync
Options
Général
- Le script ne prend aucun argument
- Les options sont présentes et documentées dans le fichier .pushlogs.env
Crontab
Les crontab peuvent utiliser nice et ionice afin de limiter les ressources. L'envoie des logs étant de priorité inférieur aux traitements métier. Exemple (dans /var/spool/cron/plopuser) :
# Push logs 05 02 * * * nice -n 10 ionice -n 7 bash ~/scripts/pushlogs.sh >> ~/logs/pushlogs.txt 2>> ~/logs/pushlogs.err
~/.pushlogs.env
- Voir ce fichier.
- Une limitation de la bande passe permet de ne pas impacter le métier (BMLIMIT)
- Il peut être utilse de limité l'envoie des logs aux seules fichiers récemment modifiés. Exemple pour les fichiers des 2 derniers jours :
FIND_OPTS='-mtime -2
~/.pushlogs.lst
- Contient la liste dans fichiers / dossier à envoyer
- Le chemin est relatif à l'homedir de l'utilisateur (normalement '/home/plopuser/')
- Il est possible d'utiliser des wildcards “*”. Exemple :
./app*/L*/logs_backup/
Génération des clefs
Les paires de clefs ont été générées de la façon suivante :
ssh-keygen -N '' -t rsa -b 4096 -C "XXX01_rsync_pushlog" -f id_xxx01_rsync_pushlog ssh-keygen -N '' -t rsa -b 4096 -C "XXX02_rsync_pushlog" -f id_xxx02_rsync_pushlog
.pushlogs.env
# Limit network bandwidth in KiB/s BMLIMIT=5000 # root dir to backup. Should not be changed BACKUP_ROOT_DIR="$HOME" # SSH settings SSH_USER=plopuser SSH_HOST=localhost SSH_DIR=/tmp/plop #SSH_PORT: See SSH_OPTS. Example: SSH_OPTS='-p 2222' # Extra find options FIND_OPTS='' #FIND_OPTS='-mtime -2' # Extra rsync options RSYNC_OPTS='-c --itemize-changes' # Extra SSH rsync options SSH_OPTS='-p 22'
.pushlogs.env
./app*/L*/logs_backup/ ./app*/L*/log/ ./app*/L*/templog ./app*/scripts/backup_logfiles_l*.out
pushlogs.sh
#! /bin/bash set -euo pipefail IFS=$' \t\n' export LC_ALL=C SCRIPT_NAME=$(basename "$0") PIDFILE=/dev/shm/${SCRIPT_NAME%.sh}.pid ENVFILE=${HOME}/.${SCRIPT_NAME%.sh}.env LISTSCRFILE=${HOME}/.${SCRIPT_NAME%.sh}.lst trap 'rm -f "$PIDFILE"' EXIT ERR echo "$(date --rfc-3339=second)" DEBUT EXECUTION set +e if [ -f "$PIDFILE" ]; then PLOP_PID=$(head -1 "$PIDFILE") echo "WARNING EALREADY: Operation already in progress (114)" >&2 kill "$PLOP_PID" >/dev/null 2>&1 sleep 5 kill -9 "$PLOP_PID" >/dev/null 2>&1 sleep 5 if [ -d /proc/"$PLOP_PID" ]; then echo "ERROR EDEADLOCK: Resource deadlock avoided (35)" >&2 exit 35 else rm -f "$PIDFILE" fi else echo $$ >"$PIDFILE" fi set -e # shellcheck source=pushlogs.env source "$ENVFILE" main() { echo "$(date --rfc-3339=second)" DEBUT COPIE cd "$BACKUP_ROOT_DIR" || exit 2 # shellcheck disable=SC2068,SC2046 find $(grep -v '^#' "$LISTSCRFILE") -type f ${FIND_OPTS[@]} -print0 | rsync -e "ssh -o StrictHostKeyChecking=no -o CheckHostIP=no ${SSH_OPTS[*]}" \ --bwlimit="$BMLIMIT" ${RSYNC_OPTS[@]} --files-from=- --from0 "${BACKUP_ROOT_DIR}" "${SSH_USER}"@"${SSH_HOST}":"${SSH_DIR}" cd - echo "$(date --rfc-3339=second)" FIN } main
tech/exemple_de_script_rsync_d_envoie_de_fichiers_via_ssh.1761817438.txt.gz · Dernière modification : de Jean-Baptiste
