Déployer un fichier sur plusieurs serveurs

CréationNicolas 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.

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • linux_deploy.txt
  • Dernière modification : 2021/03/05 16:19
  • de nekan