tech:exemple_de_script_rsync_d_envoie_de_fichiers_via_ssh

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

FIXME

tech/exemple_de_script_rsync_d_envoie_de_fichiers_via_ssh.txt · Dernière modification : de Jean-Baptiste

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki