Déployer un fichier sur plusieurs serveurs
Création — Nicolas THOREZ 2020/01/27 09:50
Pour copier un fichier depuis un poste vers un serveur, on peut utiliser la commande scp. Cependant, quand il s'agit de copier ce fichier sur plusieurs serveurs, cela peut rapidement devenir rébarbatif. Le script suivant permet d'automatiser ces transferts.
#!/bin/bash
#####################################################################
#
# Script de déploiement de fichier sur les serveurs
#
# Par Nicolas THOREZ
#
#####################################################################
#### Déclarations des fonctions #####
# Fonction d'aide
display-help()
{
# Affichage de l'aide
echo "Aide pour deploy-file.sh"
echo ""
echo "Script de déploiement de fichier sur les serveurs."
echo ""
echo "Usage : ./deploy-file.sh [-f|--file] fichier_source [-d|--destination] serveur_de_destination [-v|--verbose]"
echo ""
echo "Demande d'aide : ./deploy-file.sh [-h|--help]"
echo ""
echo "Paramètres et arguments :"
echo ""
echo "-h, --help Affiche cette aide."
echo ""
echo "-v, --verbose Active le mode verbeux."
echo ""
echo "-f, --file Chemin absolu du fichier à déployer."
echo " Obligatoire."
echo ""
echo "-d, --destination Nom du ou des serveurs sur lesquels déployer le fichier."
echo " Facultatif."
echo " Les noms doivent être séparés par des virgules (,)."
echo " Si aucun nom n'est indiqué, le fichier sera déployer sur tous les serveurs renseignés dans le fichier ./servers.list ."
echo ""
exit 2
}
# Fonction d'affichage verbeux et d'inscription des logs
add-log()
{
# Variables pour la coloration syntaxique du mode verbeux
GOOD="\e[92m"
CRIT="\e[91m"
WARN="\e[93m"
INFO="\e[96m"
OFF="\e[39m"
# Variable date et heure
DATE=$(date '+%Y/%m/%d %H:%M:%S')
# Gestion des arguments pour la fonction
while [[ $# -gt 0 ]]
do
LOG_PARAM="$1"
case $LOG_PARAM in
# fichier de logs
-f|--file)
LOG="$2"
shift
shift
;;
# Niveau de log
-l|--level)
LEVEL="$2"
shift
shift
;;
# Message
-m|--message)
MESSAGE="$2"
shift
shift
;;
# Autres
*)
echo -e "$DATE $CRIT[CRIT]$OFF Erreur d'arguments pour la fonction$CRIT add-log$OFF. Merci de vérifier votre code."
esac
done
# Enregistrement dans le fichier log
if [ -f $LOG ]
then
echo "$DATE [$LEVEL] $MESSAGE" >> $LOG
else
touch $LOG
echo "$DATE [$LEVEL] $MESSAGE" >> $LOG
fi
# Affichage console en cas de mode verbeux
if [ "$VERBOSE" == "TRUE" ]
then
case $LEVEL in
"GOOD")
echo -e "$DATE $GOOD[GOOD]$OFF $MESSAGE"
;;
"WARN")
echo -e "$DATE $WARN[WARN]$OFF $MESSAGE"
;;
"CRIT")
echo -e "$DATE $CRIT[CRIT]$OFF $MESSAGE"
;;
"INFO")
echo -e "$DATE $INFO[INFO]$OFF $MESSAGE"
;;
esac
fi
}
##### Traitement des arguments en entrée #####
while [[ $# -gt 0 ]]
do
PARAM="$1"
case $PARAM in
# aide
"-h"|"--help")
display-help
shift
;;
# mode verbeux
"-v"|"--verbose")
VERBOSE="TRUE"
shift
;;
# client
"-f"|"--file")
FILE="$2"
shift
shift
;;
# projet
"-d"|"--destination")
DESTINATION="$2"
shift
shift
;;
# autres options non déterminées
*)
display-help
shift
;;
esac
done
##### Déclaration des variables #####
# Liste de tous les serveurs
ALL_SERVERS=/usr/local/batch/servers.list
# Fichier log
LOG_FILE=/usr/local/batch/deploy.log
add-log -f $LOG_FILE -l "INFO" -m "Début de l'exécution du script."
##### Vérification des arguments en entrée #####
# Vérification de FILE
if [ -z $FILE ]
then
add-log -f $LOG_FILE -l "CRIT" -m "Aucun fichier source indiqué."
display-help
else
if [ -r $FILE ]
then
add-log -f $LOG_FILE -l "INFO" -m "SOURCE = $FILE"
else
add-log -f $LOG_FILE -l "CRIT" -m "Fichier source illisible."
exit 2
fi
fi
# Vérification de DESTINATION
if [ -z $DESTINATION ]
then
add-log -f $LOG_FILE -l "INFO" -m "Aucun serveur spécifié, déploiement sur tous les serveurs."
ALL="TRUE"
else
add-log -f $LOG_FILE -l "INFO" -m "CIBLE = $DESTINATION"
ALL="FALSE"
fi
##### Traitement #####
if [ "$ALL" == "TRUE" ]
then
# Déploiement sur tous les serveurs
while read SERVER
do
# Copie du fichier sur le serveur cible
scp $FILE $SERVER:$FILE > /dev/null
# Vérification de la copie
if [[ $? -eq 0 ]]
then
add-log -f $LOG_FILE -l "GOOD" -m "Fichier déployé sur $SERVER"
else
add-log -f $LOG_FILE -l "WARN" -m "Erreur de copie vers $SERVER"
fi
done < $ALL_SERVERS
else
# Déploiement vers les serveurs spécifiés
for SERVER in `echo $DESTINATION | tr "," " "`
do
# Copie du fichier sur le serveur cible
scp $FILE $SERVER:$FILE > /dev/null
# Vérification de la copie
if [[ $? -eq 0 ]]
then
add-log -f $LOG_FILE -l "GOOD" -m "Fichier déployé sur $SERVER"
else
add-log -f $LOG_FILE -l "WARN" -m "Erreur de copie vers $SERVER"
fi
done
fi
# Fin du traitement
add-log -f $LOG_FILE -l "INFO" -m "Fin du déploiement"
Ce script copiera le fichier source, indiqué par le paramètre -f, vers les serveurs indiqué par le paramètre -d et séparés par une vigule (exemple : serveur1,serveur2,serveur3). Si aucun serveur n'est indiqué, le script utilisera le fichier servers.list comme liste de serveurs de destination. Ce fichier doit contenir un serveur par ligne. L'option -v permet d'avoir une sortie sur la console.
Toutes les actions du script sont enregistrés dans le fichier deploy.log.
Discussion