Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
nagios_webcheck [2020/02/12 15:22] nekannagios_webcheck [2021/03/05 19:06] (Version actuelle) nekan
Ligne 1: Ligne 1:
-~~CLOSETOC~~ 
 ====== Surveillance automatique des sites web ====== ====== Surveillance automatique des sites web ======
 +<label type="info">Création</label> --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2020/02/12 15:06//
  
 Pour un projet j'ai dû mettre une supervision sur les sites web de mon entreprise. Lorsqu'il n'y a qu'un serveur web avec un seul site, c'est pas très compliqué. Mais quand l'entreprise gère plusieurs dizaines de serveurs hébergeant chacun plusieurs dizaines de sites, ça peut rapidement devenir compliquer. Pour un projet j'ai dû mettre une supervision sur les sites web de mon entreprise. Lorsqu'il n'y a qu'un serveur web avec un seul site, c'est pas très compliqué. Mais quand l'entreprise gère plusieurs dizaines de serveurs hébergeant chacun plusieurs dizaines de sites, ça peut rapidement devenir compliquer.
Ligne 8: Ligne 8:
   * Les nouveaux serveurs Apache sont alors détecté et une alerte nous indique d'y ajouter les scripts nécessaires au besoin   * Les nouveaux serveurs Apache sont alors détecté et une alerte nous indique d'y ajouter les scripts nécessaires au besoin
  
-<note important>Le paquet ''curl'' est nécessaire sur le serveur Apache. +<callout type="warning" title="Prérequis" icon="true">Le paquet ''curl'' est nécessaire sur le serveur Apache. 
-Les paquets ''curl'', ''wget'' et ''nagios-plugins'' sont nécessaire sur le serveur Nagios.</note>+Les paquets ''curl'', ''wget'' et ''nagios-plugins'' sont nécessaire sur le serveur Nagios.</callout> 
 + 
 +<callout type="info" title="Mise à jour du 17/02/2020" icon="true">  
 +  * Ajout de la gestion des sites et serveurs à ignorer 
 +  * Suppression des doublons dans les vérifications Nagios 
 +  * Correction de quelques fautes d'orthographe. 
 +</callout>
 ===== Principe ===== ===== Principe =====
  
Ligne 25: Ligne 31:
   * Le script général crée une liste de tous les serveurs qui ont une surveillance sur le service Apache.   * Le script général crée une liste de tous les serveurs qui ont une surveillance sur le service Apache.
   * Pour chaque serveur de cette liste, il récupère les fichiers de réponse qui se trouve sur le dépôt externe.   * Pour chaque serveur de cette liste, il récupère les fichiers de réponse qui se trouve sur le dépôt externe.
 +    * Si le serveur est dans la liste des serveurs à ignorer, il passe au serveur suivant.
     * Si les fichiers sont manquant, le serveur en question est ajouté à la liste des serveurs en erreur et le script passe au serveur suivant. Cette erreur est due soit à une erreur de réseau soit à l'absence du script d'inventaire.     * Si les fichiers sont manquant, le serveur en question est ajouté à la liste des serveurs en erreur et le script passe au serveur suivant. Cette erreur est due soit à une erreur de réseau soit à l'absence du script d'inventaire.
     * Si la date est obsolète, idem. Là, c'est soit un problème réseau, soit une erreur de cron.     * Si la date est obsolète, idem. Là, c'est soit un problème réseau, soit une erreur de cron.
     * Si des différences sont notés, le serveur est ajouté à la liste des serveurs ayant des sites inactifs puis continue le traitement.     * Si des différences sont notés, le serveur est ajouté à la liste des serveurs ayant des sites inactifs puis continue le traitement.
   * Le script gère alors les sites déclarés pour chaque serveurs :   * Le script gère alors les sites déclarés pour chaque serveurs :
-    * Pour chaque site, il vérifie si le site est supervisé sinon il ajoute la supervision.+    * Si le site est dans la liste des sites à ignorer, il passe au suivant. 
 +    * Il vérifie alors si le site est supervisé et si il ne l'est pas : 
 +      * Il teste la connexion au site. 
 +      * Si c'est bon, il ajoute la supervision
 +      * Si c'est en erreur (code 404 par exemple), il ajoute le site dans la liste des sites à ignorer.
     * Si l'ajout réussi, il ajoute le site à la liste des sites supervisés et à celle des sites nouvellement ajoutés.     * Si l'ajout réussi, il ajoute le site à la liste des sites supervisés et à celle des sites nouvellement ajoutés.
     * Si l'ajout rate, il ajoute le site à la liste des sites en erreur.     * Si l'ajout rate, il ajoute le site à la liste des sites en erreur.
Ligne 68: Ligne 79:
  
 # Mot de passe # Mot de passe
-PASS="password"+PASS="P@ssw0rd"
  
 # Dépôt local # Dépôt local
Ligne 277: Ligne 288:
  
  # Boucle d'ajout des serveurs  # Boucle d'ajout des serveurs
- for SERVER in $(cat $SERVER_ERROR)+ for SERVER in $(cat $SERVER_ERROR | uniq | sort) 
 + do 
 + # Ajout du serveur 
 + echo "<li>$SERVER</li>" >> $HTML 
 + done 
 + 
 + # Fermeture de la liste 
 + echo "</ul>" >> $HTML 
 + fi 
 + 
 + # Bloc des serveurs à ignorer 
 + TEST=$(cat $SERVER_IGNORE | wc -l) 
 + if [ "$TEST" != "0"
 + then 
 + # Création d'un titre 
 + echo "<h3>Liste des serveurs à ignorer</h3>" >> $HTML 
 + 
 + # Création d'une liste 
 + echo "<ul>" >> $HTML 
 + 
 + # Boucle d'ajout des serveurs 
 + for SERVER in $(cat $SERVER_IGNORE | uniq | sort)
  do  do
  # Ajout du serveur  # Ajout du serveur
Ligne 298: Ligne 330:
  
  # Boucle d'ajout des sites  # Boucle d'ajout des sites
- for SITE in $(cat $SITE_ERROR)+ for SITE in $(cat $SITE_ERROR | uniq | sort)
  do  do
  # Ajout du site  # Ajout du site
Ligne 319: Ligne 351:
  
  # Boucle d'ajout des serveurs  # Boucle d'ajout des serveurs
- for SERVEUR in $(cat $SITE_DISABLE)+ for SERVER in $(cat $SITE_DISABLE | uniq | sort)
  do  do
  # Ajout du serveur  # Ajout du serveur
  echo "<li>$SERVER</li>" >> $HTML  echo "<li>$SERVER</li>" >> $HTML
 + done
 +
 + # Fermeture de la liste
 + echo "</ul>" >> $HTML
 + fi
 +
 + # Bloc des sites ignorés
 + TEST=$(cat $SITE_IGNORE | wc -l)
 + if [ "$TEST" != "0" ]
 + then
 + # Création d'un titre
 + echo "<h3>Liste des sites ignorés</h3>" >> $HTML
 +
 + # Création d'une liste
 + echo "<ul>" >> $HTML
 +
 + # Boucle d'ajout des sites
 + for SITE in $(cat $SITE_IGNORE | uniq | sort)
 + do
 + # Ajout du site
 + echo "<li>$SITE</li>" >> $HTML
  done  done
  
Ligne 340: Ligne 393:
  
  # Boucle d'ajout des sites  # Boucle d'ajout des sites
- for SITE in $(cat $SITE_NEW)+ for SITE in $(cat $SITE_NEW | uniq | sort)
  do  do
  # Ajout du site  # Ajout du site
Ligne 361: Ligne 414:
  
  # Boucle d'ajout des sites  # Boucle d'ajout des sites
- for SITE in $(cat $SITE_GOOD)+ for SITE in $(cat $SITE_GOOD | uniq | sort)
  do  do
  # Ajout du site  # Ajout du site
Ligne 388: Ligne 441:
 # Mode verbeux pour debogage # Mode verbeux pour debogage
 VERBOSE="TRUE" VERBOSE="TRUE"
 +
 +# Chemin du script
 +EXEC_PATH=/usr/local/batch/webcheck
  
 # Fichier log # Fichier log
-LOG_FILE=/usr/local/batch/webcheck/check-all-websites.log+LOG_FILE=$EXEC_PATH/check-all-websites.log
  
 # Fichier de rapport HTML # Fichier de rapport HTML
-REPORT=/usr/local/batch/webcheck/rapport.html+REPORT=$EXEC_PATH/rapport.html
  
 # Adresse mail du restinataire du rapport # Adresse mail du restinataire du rapport
Ligne 408: Ligne 464:
  
 # Mot de passe drive # Mot de passe drive
-DRIVE_PASS="password"+DRIVE_PASS="P@ssw0rd"
  
-# Dépôt local +# Dépôt git local 
-LOCAL="/usr/local/batch/webcheck/repository"+LOCAL=$EXEC_PATH/repository
  
-# User Nagios SiteA & SiteB & SiteC+# User Nagios SiteA & SiteB
 USER="nagiosadmin" USER="nagiosadmin"
  
Ligne 420: Ligne 476:
  
 # Mot de passe Nagios SiteA # Mot de passe Nagios SiteA
-PASS_A="PasswordA"+PASS_A="P@ssw0rd"
  
 # Filtre de recherche SiteA # Filtre de recherche SiteA
Ligne 429: Ligne 485:
  
 # Mot de passe Nagios SiteB # Mot de passe Nagios SiteB
-PASS_B="PasswordB"+PASS_B="P@ssw0rd"
  
 # Filtre de recherche SiteB # Filtre de recherche SiteB
 PATTERN_B="Processus Apache" PATTERN_B="Processus Apache"
  
-# URL Nagios SiteC +# Filtre de recherche Nagios final 
-NAGIOS_C="http://127.0.0.1/nagios/cgi-bin/status.cgi?host=localhost&start=0&limit=0" +PATTERN_FINAL="Site"
- +
-# Mot de passe Nagios SiteC +
-PASS_C="PasswordC" +
- +
-# Filtre de recherche SiteC +
-PATTERN_C="Site"+
  
 # Fichier de réponse pour les serveurs en erreur # Fichier de réponse pour les serveurs en erreur
-SERVER_ERROR=/usr/local/batch/webcheck/server-error.list+SERVER_ERROR=$EXEC_PATH/server-error.list
  
 # Fichier de réponse pour les sites en erreur # Fichier de réponse pour les sites en erreur
-SITE_ERROR=/usr/local/batch/webcheck/site-error.list+SITE_ERROR=$EXEC_PATH/site-error.list
  
 # Fichier de réponse pour les sites supervisés # Fichier de réponse pour les sites supervisés
-SITE_GOOD=/usr/local/batch/webcheck/site-good.list+SITE_GOOD=$EXEC_PATH/site-good.list
  
 # Fichier de réponse pour les sites nouvellement supervisés # Fichier de réponse pour les sites nouvellement supervisés
-SITE_NEW=/usr/local/batch/webcheck/site-new.list+SITE_NEW=$EXEC_PATH/site-new.list
  
 # Fichier de réponse pour les serveurs ayant des sites non activés # Fichier de réponse pour les serveurs ayant des sites non activés
-SITE_DISABLE=/usr/local/batch/webcheck/site-disable.list+SITE_DISABLE=$EXEC_PATH/site-disable.list
  
 # Fichier de définitions de services Nagios # Fichier de définitions de services Nagios
 SERVICE=/usr/local/nagios/etc/objects/services_webcheck.cfg SERVICE=/usr/local/nagios/etc/objects/services_webcheck.cfg
 +
 +# Liste des serveurs à ignorer
 +SERVER_IGNORE=$EXEC_PATH/server-ignore.list
 +
 +# Liste des sites à ignorer
 +SITE_IGNORE=$EXEC_PATH/site-ignore.list
  
 ##### Préparation ##### ##### Préparation #####
Ligne 517: Ligne 573:
  
 # Log # Log
-add-log -f $LOG_FILE -l "GOOD" -m "[ GENERAL ] Création de la lsite des serveurs Apache."+add-log -f $LOG_FILE -l "GOOD" -m "[ GENERAL ] Création de la liste des serveurs Apache."
  
 ##### Boucle de traitement des serveurs ##### ##### Boucle de traitement des serveurs #####
Ligne 529: Ligne 585:
  # Log  # Log
  add-log -f $LOG_FILE -l "INFO" -m "[ $SERVER ] Début de traitement."  add-log -f $LOG_FILE -l "INFO" -m "[ $SERVER ] Début de traitement."
 +
 + # Vérification de la présence du site dans la liste des sites à ignorer
 + TEST_IGNORE=$(cat $SERVER_IGNORE | grep -i $SERVER | wc -l)
 + if [[ $TEST_IGNORE -eq 0 ]]
 + then
 + # Log
 + add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] Valide pour traitement."
 + else
 + # Log
 + add-log -f $LOG_FILE -l "WARN" -m "[ $SERVER ] Serveur à ignorer."
 + continue
 + fi
  
  # Récupération des fichiers du dépôt externe  # Récupération des fichiers du dépôt externe
Ligne 597: Ligne 665:
  # Log  # Log
  add-log -f $LOG_FILE -l "INFO" -m "[ $SERVER ] [ $SITE ] Début du traitement."  add-log -f $LOG_FILE -l "INFO" -m "[ $SERVER ] [ $SITE ] Début du traitement."
 +
 + # Vérification de la présence du site dans la liste des sites à ignorer
 + TEST_IGNORE=$(cat $SITE_IGNORE | grep -i $SITE | wc -l)
 + if [[ $TEST_IGNORE -eq 0 ]]
 + then
 + # Log
 + add-log -f $LOG_FILE -l "INFO" -m "[ $SERVER ] [ $SITE ] Valide pour traitement."
 + else
 + # Log
 + add-log -f $LOG_FILE -l "WARN" -m "[ $SERVER ] [ $SITE ] Site à ignorer."
 + continue
 + fi
  
  # Vérification du l'existence du check Nagios  # Vérification du l'existence du check Nagios
- IS_CHECKED=$(curl -s -k -u $USER:$PASS_C $NAGIOS_C | grep -i "$PATTERN_C $SITE" | wc -l)+ IS_CHECKED=$(grep -i "$PATTERN_FINAL $SITE" $SERVICE | wc -l)
  if [[ $IS_CHECKED -eq 0 ]]  if [[ $IS_CHECKED -eq 0 ]]
  then  then
Ligne 614: Ligne 694:
  add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] [ $SITE ] Test réussi."  add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] [ $SITE ] Test réussi."
  
-Ajout du check au fichier de configuration de Nagios +Vérification du code de retour 
- echo "" >> $SERVICE + CODE=$(echo $HTTP | awk '{print $4}') 
- echo "define service{" >> $SERVICE + case "$CODE" in 
- echo    host_name              localhost" >> $SERVICE + 400) 
- echo "    use                    generic-service" >> $SERVICE + # Log 
- echo    service_description    Site $SITE>> $SERVICE + add-log -$LOG_FILE -l "WARN-m "$SERVER ] [ $SITE ] Mauvaise requête, ignoré."
- echo "    check_command          check_website>> $SERVICE +
- echo "    _URL                   $SITE" >> $SERVICE +
- echo "}" >> $SERVICE+
  
- Vérification de la configuration Nagios + Ajout à la liste des sites à ignorer 
- PREFLIGHT=$(/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg | grep -i 'Things look okay' | wc -l) + echo $SITE >> $SITE_IGNORE
- if [[ $PREFLIGHT -eq 1 ]] +
- then +
- # Log +
- add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] [ $SITE ] Service Nagios ajouté."+
  
- Ajout du site dans le fichier des sites valides + Fin de l'option 
- echo $SITE >> $SITE_GOOD + ;; 
- echo $SITE >> $SITE_NEW + 404) 
- else + # Log 
- # Log + add-log -f $LOG_FILE -l "WARN" -m "$SERVER [ $SITE ] Site introuvable, ignoré."
- add-log -f $LOG_FILE -l "CRIT" -m "NAGIOS Erreur de configuration détecté."+
  
- Désactivation du fichier de service + Ajout à la liste des sites à ignorer 
- mv $SERVICE $SERVICE.lock+ echo $SITE >> $SITE_IGNORE
  
- Nouveau test + Fin de l'option 
- PREFLIGHT=$(/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg | grep -i 'Things look okay' | wc -l) + ;; 
- if [[ $PREFLIGHT -eq 1 ]] + 401)
- then+
  # Log  # Log
- add-log -f $LOG_FILE -l "WARN" -m "[ NAGIOS ] Fichier de définition de services désactivé." + add-log -f $LOG_FILE -l "WARN" -m "[ $SERVER ] [ $SITE ] Accès non autorisé, ignoré." 
- add-log -f $LOG_FILE -l "GOOD" -m "[ NAGIOS ] Configuration correcte rétablie." + 
- add-log -f $LOG_FILE -l "CRIT" -m "[ $SERVER ] [ $SITE ] Echec de l'inscription du service." + # Ajout à la liste des sites à ignorer 
- send-report -f $REPORT -a $MAIL -m "[ WARN ] Arrêt suite à l'échec d'inscription d'un site dans Nagios. Nagios actif." + echo $SITE >> $SITE_IGNORE 
- add-log -f $LOG_FILE -"WARN" -m "[ GENERAL ] Arrêt prématuré du script." + 
- exit 1 + # Fin de l'option 
- else+ ;; 
 + 403)
  # Log  # Log
- add-log -f $LOG_FILE -l "WARN" -m "[ NAGIOS ] Fichier de définition de services désactivé." + add-log -f $LOG_FILE -l "WARN" -m "[ $SERVER ] [ $SITE ] Accès interdit, ignoré." 
- add-log -f $LOG_FILE -l "CRIT" -m "[ NAGIOS ] Configuration correcte non rétablie." + 
- add-log -f $LOG_FILE -l "CRIT" -m "[ $SERVER ] [ $SITE ] Echec de l'inscription du service." + # Ajout à la liste des sites à ignorer 
- send-report -f $REPORT -a $MAIL -m "[ CRIT ] Arrêt suite à l'échec d'inscription d'un site dans Nagios. Nagios inactif." + echo $SITE >> $SITE_IGNORE 
- add-log -f $LOG_FILE -l "CRIT" -m "[ GENERAL ] Arrêt prématuré du script." + 
- exit 2 + # Fin de l'option 
- fi + ;; 
- fi+ *) 
 + # Log 
 + add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] [ $SITE ] Accès autorisé." 
 + 
 + # Ajout du check au fichier de configuration de Nagios 
 + echo "" >> $SERVICE 
 + echo "define service{" >> $SERVICE 
 + echo "    host_name              localhost" >> $SERVICE 
 + echo "    use                    generic-service" >> $SERVICE 
 + echo "    service_description    Site $SITE" >> $SERVICE 
 + echo "    check_command          check_website" >> $SERVICE 
 + echo "    _URL                   $SITE" >> $SERVICE 
 + echo "}" >> $SERVICE 
 + 
 + # Vérification de la configuration Nagios 
 + PREFLIGHT=$(/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg | grep -i 'Things look okay' | wc -l) 
 + if [[ $PREFLIGHT -eq 1 ]] 
 + then 
 + # Log 
 + add-log -f $LOG_FILE -l "GOOD" -m "[ $SERVER ] [ $SITE ] Service Nagios ajouté." 
 + 
 + # Ajout du site dans le fichier des sites valides 
 + echo $SITE >> $SITE_GOOD 
 + echo $SITE >> $SITE_NEW 
 + else 
 + # Log 
 + add-log -f $LOG_FILE -l "CRIT" -m "[ NAGIOS ] Erreur de configuration détecté." 
 + 
 + # Désactivation du fichier de service 
 + mv $SERVICE $SERVICE.lock 
 + 
 + # Nouveau test 
 + PREFLIGHT=$(/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg | grep -i 'Things look okay' | wc -l) 
 + if [[ $PREFLIGHT -eq 1 ]] 
 + then 
 + # Log 
 + add-log -f $LOG_FILE -l "WARN" -m "[ NAGIOS ] Fichier de définition de services désactivé." 
 + add-log -f $LOG_FILE -l "GOOD" -m "[ NAGIOS ] Configuration correcte rétablie." 
 + add-log -f $LOG_FILE -l "CRIT" -m "[ $SERVER ] [ $SITE ] Echec de l'inscription du service." 
 + send-report -f $REPORT -a $MAIL -m "[ WARN ] Arrêt suite à l'échec d'inscription d'un site dans Nagios. Nagios actif." 
 + add-log -f $LOG_FILE -l "WARN" -m "[ GENERAL ] Arrêt prématuré du script." 
 + exit 1 
 + else 
 + # Log 
 + add-log -f $LOG_FILE -l "WARN" -m "[ NAGIOS ] Fichier de définition de services désactivé." 
 + add-log -f $LOG_FILE -l "CRIT" -m "[ NAGIOS ] Configuration correcte non rétablie." 
 + add-log -f $LOG_FILE -l "CRIT" -m "[ $SERVER ] [ $SITE ] Echec de l'inscription du service." 
 + send-report -f $REPORT -a $MAIL -m "[ CRIT ] Arrêt suite à l'échec d'inscription d'un site dans Nagios. Nagios inactif." 
 + add-log -f $LOG_FILE -l "CRIT" -m "[ GENERAL ] Arrêt prématuré du script." 
 + exit 2 
 + fi 
 + fi 
 + 
 + # Fin de l'option 
 + ;; 
 + 
 + # Fin du choix 
 + esac
  
  # Fin de l'option  # Fin de l'option
Ligne 722: Ligne 851:
  
  # Préparation à la suppression  # Préparation à la suppression
- DESCRIPTION_LINE=$(grep -n "service_description[[:space:]]*${PATTERN_C}[[:space:]]${SITE}[[:space:]]*$" $SERVICE | sed 's/://g' | awk '{print $1}')+ DESCRIPTION_LINE=$(grep -n "service_description[[:space:]]*${PATTERN_FINAL}[[:space:]]${SITE}[[:space:]]*$" $SERVICE | sed 's/://g' | awk '{print $1}')
  if [ "$( echo $DESCRIPTION_LINE | grep -v [^0-9])" ]  if [ "$( echo $DESCRIPTION_LINE | grep -v [^0-9])" ]
  then  then
Ligne 918: Ligne 1047:
 ===== Conclusion ===== ===== Conclusion =====
  
-A partir de maintenant, chaque fois qu'un serveur Apache sera sous surveillance, le script nous rappellera d'y déployer le script d'inventaire avec son cron (si c'est pas encore fait). De plus tous les nouveaux sites web seront automatiquement supervisés, tous les sites supprimés verront leur supervision supprimée de même et un rapport journalier nous permettra de suivre l'évolution de cette gestion.+A partir de maintenant, chaque fois qu'un serveur Apache sera sous surveillance, le script nous rappellera d'y déployer le script d'inventaire avec son cron (si c'est pas encore fait). De plus tous les nouveaux sites web seront automatiquement supervisés, tous les sites supprimés verront leur supervision supprimée de même et un rapport journalier nous permettra de suivre l'évolution de cette gestion automatique.
  
- --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2020/02/12 15:06// 
 ~~DISCUSSION~~ ~~DISCUSSION~~
  
  • nagios_webcheck.1581517351.txt.gz
  • Dernière modification : 2020/02/12 13:22
  • (modification externe)