Architecture Haute Disponibilité Nagios

Le but de cet article est de présenter une architecture Nagios Haute Disponibilitée avec plusieurs serveurs Nagios fonctionnant en maître/esclave avec synchronisation des Etats (Hosts & Services) du maître vers l'esclave.

Principe de fonctionnement

Les instances Nagios fonctionnent en Maître/Esclave. Les deux instances Nagios sont en capacité de surveiller tout le réseau, mais seul le Maître effectue les « scripts de check » et synchronise les statuts des hôtes et services vers l'esclave via le protocole NSCA (NSCA fait partie intégrante de Nagios). De ce fait l’esclave possède l'état des hôtes et services du réseau sans jamais effectuer aucun « scripts de check » de surveillance à une exception ! L'exception est que l'instance de Nagios esclave doit vérifier en permanence que l’instance Nagios Maître distante est toujours en cours d'exécution. Ceci est fait également via un « script de check » ! En cas d'un code retour d'erreur de ce dernier l'instance Nagios Esclave bascule en instance Nagios Maître. De plus, ce « script de check » ne déclenchera jamais de notification via le protocole NSCA pouvant aboutir à des alarmes.

Schéma de l'architecture Haute Disponibilité Nagios

L'architecture est composée :

  • [ En DMZ ] de 2 serveurs NAGIOS (configuré en maître/esclave) effectuant uniquement les « scripts de check » de surveillance.
  • [ Hors DMZ ] Ce point ne sera pas abordé ici…

Fichiers de configurations

hostgroups.cfg

Ce fichier contient les définitions des groupes « d’hosts ». Il doit respecter des règles de formatage pour que les scripts suivants de Hautes Disponibilités (Script A & Script B) puissent fonctionner via les variables LISTE_HOSTGROUP , LISTE_HOSTGROUP_AUTRES, SITE_A, SITE_B et SITE_AUTRE. Elles permettent de lister les groupes de serveurs utiles aux commandes D'ACTIVATION et de DÉSACTIVATION placées dans les Script A et Script B.

define hostgroup
        hostgroup_name  ServeurWEB_Bordeaux
        alias           Serveur WEB du Site Bordeaux
        members         servWEB1,servWEB2,serWEB3
        }
[IMPORTANT] : La directive la plus importante est [hostgroup_name X_xxxxYYYY]. Sa définition doit comporter impérativement la chaîne de caractère équivalente à YYYY ! Dans ce cas YYYY est équivalent à ServeurWEB_Bordeaux et doit être affecté à des variables SITE_A, SITE_B ou SITE_AUTRE des Script A et Script B.

services.cfg

define service{
        use                             generic-service
        host_name                       nagios_A,nagios_B
        service_description             NAGIOS
        notification_options            c,r
        check_command                   check_remote_nagios2    ; Script A
        event_handler                   enable_master           ; Script B
        obsess_over_service             0                       ; Pour ne pas envoyer le résultat via les commandes OCSP
        normal_check_interval           1
        retry_check_interval            1
        max_check_attempts              1
        }

check_nagios_master_synchro.cfg

Ce fichier de configuration n'existe pas dans Nagios, il est utilisé uniquement par les scripts de Hautes Disponibilités (Script A & Script B) Il contient la configuration des instances Nagios Maître/Esclave et l’état du lien inter-site. Mes deux serveurs Nagios sont nagios_A et nagios_B

start_state_nagios_master nagios_A
current_state_nagios_master nagios_A
lien_intersite up

  • start_state_nagios_master : L’administrateur définit dans cette directive l’instance maître entre nagios_A et * nagios_B. Attention à ne pas mettre de valeurs différentes entre les deux fichiers de configurations de nagios_A et nagios_B.
  • current_state_nagios_master : Cette directive définit qui est l’actuel Maître de l’instance entre nagios_A et nagios_B. Cette directive est modifiée par les scripts check_remote_nagios2 et enable_master. Cette directive ne doit pas être modifiée par l’administrateur, elle est mise à jour automatiquement.
  • lien_intersite : Cette directive définit l’état actuel du lien inter-site. Elle ne doit pas être modifiée par l’administrateur.

Les scripts de Hautes Disponibilités

Les deux scripts de Hautes Disponibilités sont configurés en tant que service de contrôle. Il faut les voir comme un contrôle de Nagios Distant !

Script A

  • Élection Maître/Esclave
  • Activation ou désactivation des checks Nagios (en cas de bascule ou en cas d'élection)
  • Surveille l'instance Maître Nagios
  • Surveille le lien intersite

Script B

  • Il est exécuté si le Script A renvoie un code retour différent de 0
  • Activation des checks Nagios pour un passage d'un esclave en maître

Script A

#!/bin/bash
#
#
################################################################
# 
# Script de "Check Nagios Distant" + "Check Liaison Intersite"
#
# Réalisé par Julien 06-10-2010
#
#
################################################################
#set -x
 
USER=$1
HOST=$2
USER3=$3
USER4=$4
SW_SITE_A=$5
SW_SITE_B=$6
SERVICE_SPECIAL=NAGIOS
 
LOGFILE="/var/log/nagios/nagios.log"
LIBEXEC=/nagios/libexec/
CONF_NAGIOS=/nagios/etc/
SITE_A="ServeurWEB_Bordeaux"
SITE_B="ServeurWEB_Lyon"
SITE_AUTRE="AUTRES"
 
CURRENT_HOST=`hostname | awk -F . '{print $1}'`
START_STATE_NAGIOS_MASTER=`grep start_state_nagios_master /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
CURRENT_STATE_NAGIOS_MASTER=`grep current_state_nagios_master /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
INTERSITE=`grep intersite /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
LISTE_HOSTGROUP=`egrep '(hostgroup_name.*${SITE_A}|hostgroup_name.*${SITE_B})' ${CONF_NAGIOS}hostgroups.cfg | awk '{print $NF}'`
LISTE_HOSTGROUP_AUTRES=`egrep '(hostgroup_name.*${SITE_AUTRE})' ${CONF_NAGIOS}hostgroups.cfg | awk '{print $NF}'`
# Concatenation des variables
LISTE_HOSTGROUP="$LISTE_HOSTGROUP $LISTE_HOSTGROUP_AUTRES"
 
 
TYPE=""
# Cette fonction permet d'initialiser NAGIOS en Maître ou Esclave en fonction du fichier de configuration 
# check_nagios_master_synchro.cfg et de l'heure de démarrage du système.
# Cette fonction active ou desactive les checks de services et d'hôtes & les commandes OCHP / OCSP
Fonction_initialisation ()
{
        DATE_SYSTEME=`date +'%s'`
        DATE_NAGIOS=`grep program_start /var/log/nagios/status.dat|cut -d"=" -f2`
        TIME_EXECUTE=360
	TIME=`expr $DATE_NAGIOS + $TIME_EXECUTE`
 
	# On teste si le service est démarré
	if [ "$DATE_SYSTEME" -lt "$TIME" ] ; then
		case $TYPE in
		maitre)
		        # Activation Des Checks
			# Ceci est fait pour éviter l'envoi des commandes à chaque execution du script
	                # Les commandes pour désactiver les notifications sont envoyées uniquement les 
	                # 6 permières minutes après le démarrage du Nagios
			Fonction_stop_start maitre
		        echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Fonction_initialisation : Initialisation à faire pour le Nagios Maître" >> $LOGFILE
		        return 0
		;;
		escalve)
	                # Ceci est fait pour éviter l'envoi des commandes à chaque execution du script
	                # Les commandes pour désactiver les notifications sont envoyées uniquement les 
	                # 6 permières minutes après le démarrage du Nagios
	                Fonction_stop_start esclave
	                echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Fonction_initialisation : Initialisation à faire pour le Nagios Escalve" >> $LOGFILE
	                return 1
		;;
		*)
		        echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Fonction_initialisation : erreur" >> $LOGFILE
		        return 2
		;;
		esac
 
	else
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Fonction_initialisation : Aucune initialisation à faire pour Nagios $TYPE" >> $LOGFILE
	        return 0
        fi
}
 
# Cette fonction permet de démarrer et d'arreter les services à chaud !
Fonction_stop_start ()
{
TYPE=$1
case $TYPE in
	maitre)
		#### ACTIVATION des send_nsca ####
		sed "s/^#\/usr\/bin\/printf/\/usr\/bin\/printf/g" ${LIBEXEC}submit_check_result_host > ${LIBEXEC}submit_check_result_host.tmp && mv -f ${LIBEXEC}submit_check_result_host.tmp ${LIBEXEC}submit_check_result_host
		chmod 755 ${LIBEXEC}submit_check_result_host
		sed "s/^#\/usr\/bin\/printf/\/usr\/bin\/printf/g" ${LIBEXEC}submit_check_result > ${LIBEXEC}submit_check_result.tmp && mv -f ${LIBEXEC}submit_check_result.tmp ${LIBEXEC}submit_check_result
		chmod 755 ${LIBEXEC}submit_check_result
 
		#### Appel des scripts de D'ACTIVATION des checks pour toute la DMZ (ou les deux sites) ####
		for i in $LISTE_HOSTGROUP
	    	do
			# Disables passive checks for all services associated with hosts in a particular hostgroup
	    	        ${LIBEXEC}contrib/disable_hostgroup_passive_svc_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_hostgroup_passive_svc_checks $i" >> $LOGFILE
 
			# Disables passive checks for all hosts in a particular hostgroup
	    	        ${LIBEXEC}contrib/disable_hostgroup_passive_host_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_hostgroup_passive_host_checks $i" >> $LOGFILE
 
			# Enables active checks for all services associated with hosts in a particular hostgroup
		 	${LIBEXEC}contrib/enable_hostgroup_active_svc_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_hostgroup_active_svc_checks $i" >> $LOGFILE
 
			# Enables active checks for all hosts in a particular hostgroup
			${LIBEXEC}contrib/enable_hostgroup_active_host_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_hostgroup_active_host_checks $i" >> $LOGFILE
	    	done
	        return 0
		;;
	esclave)
		#### DESACTIVATION des send_nsca ####
		sed "s/^\/usr\/bin\/printf/#&/g" ${LIBEXEC}submit_check_result_host > ${LIBEXEC}submit_check_result_host.tmp && mv -f ${LIBEXEC}submit_check_result_host.tmp ${LIBEXEC}submit_check_result_host
		chmod 755 ${LIBEXEC}submit_check_result_host
		sed "s/^\/usr\/bin\/printf/#&/g" ${LIBEXEC}submit_check_result > ${LIBEXEC}submit_check_result.tmp && mv -f ${LIBEXEC}submit_check_result.tmp ${LIBEXEC}submit_check_result
		chmod 755 ${LIBEXEC}submit_check_result
 
		#### Appel des scripts de DESACTIVATION des checks pour toute la DMZ ####
		for i in $LISTE_HOSTGROUP
		do
			# Disables active checks for all services associated with hosts in a particular hostgroup
			${LIBEXEC}contrib/disable_hostgroup_active_svc_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_hostgroup_active_svc_checks $i" >> $LOGFILE
 
			# Disables active checks for all hosts in a particular hostgroup
			${LIBEXEC}contrib/disable_hostgroup_active_host_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_hostgroup_active_host_checks $i" >> $LOGFILE
 
			# Enables passive checks for all services associated with hosts in a particular hostgroup
			${LIBEXEC}contrib/enable_hostgroup_passive_svc_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_hostgroup_passive_svc_checks $i" >> $LOGFILE
 
			# Enables passive checks for all hosts in a particular hostgroup
			${LIBEXEC}contrib/enable_hostgroup_passive_host_checks $i
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_hostgroup_passive_host_checks $i" >> $LOGFILE
		done
 
			#### EXCEPTION pour le service NAGIOS qui doit rester actif [ script : check_remote_Nagios2 ] ####
			# Enables active checks for a particular service
			${LIBEXEC}contrib/enable_svc_check $DIST_HOST $SERVICE_SPECIAL
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_svc_check $DIST_HOST $SERVICE_SPECIAL" >> $LOGFILE		
			# Disables passive checks for the specified service
			${LIBEXEC}contrib/disable_passive_svc_check $DIST_HOST $SERVICE_SPECIAL
			echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_passive_svc_check $DIST_HOST $SERVICE_SPECIAL" >> $LOGFILE
 
                        ${LIBEXEC}contrib/enable_svc_check $CURRENT_HOST $SERVICE_SPECIAL
                        echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/enable_svc_check $CURRENT_HOST $SERVICE_SPECIAL" >> $LOGFILE
                        # Disables passive checks for the specified service
                        ${LIBEXEC}contrib/disable_passive_svc_check $CURRENT_HOST $SERVICE_SPECIAL
                        echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') ${LIBEXEC}contrib/disable_passive_svc_check $CURRENT_HOST $SERVICE_SPECIAL" >> $LOGFILE           
			return 0
	;;
	*)
	        echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') Fonction_stop_start : erreur" >> $LOGFILE
	        return 2
	;;
esac
}
 
Fonction_current_host()
{
        if [ "$CURRENT_STATE_NAGIOS_MASTER" = "$CURRENT_HOST" ] ; then
                TYPE=maitre
        else
                TYPE=escalve
        fi
 
	case $CURRENT_HOST in
	nagios_A)
		DIST_HOST=nagios_B
		return 0
	;;
	nagios_B)
		DIST_HOST=nagios_A
		return 0
	;;
	*)
		echo "erreur"
		return 1
	;;
	esac
}
 
Fonction_dist_nagios ()
{
	ssh -l $USER $HOST "/nagios/libexec/check_nagios -e 5 -F /var/log/nagios/status.dat -C /nagios/bin/nagios" > /dev/null
	CR=$?
	#echo "CR : $CR"
	return $CR
}
 
Fonction_test_intersite ()
{
	${LIBEXEC}contrib/check_snmp_int.pl -H $SW_SITE_A -l user -w $USER3 -P $USER4 -f 5004 > /dev/null
	CR1=$?
	${LIBEXEC}contrib/check_snmp_int.pl -H $SW_SITE_B -l user -w $USER3 -P $USER4 -f 5002 > /dev/null
	CR2=$?
	if ( [ "$CR1" -eq 0 ] && [ "$CR2" -eq 0 ] ) ; then
		echo "je rentre dans la boucle au mauvaise endroit" >> $LOGFILE
		return 0
	else
		return 1
	fi
}
 
Fonction_Test_Master ()
{
	# return : 1 -> Je reste Esclave
	# return : 2 -> Je passe Escalve
	# return : 3 -> Je reste Maitre
	# return : 4 -> ALERTE Nagios distant indisponible ! -> Je passe maitre Nagios
	# return : 5 -> ALERTE Lien Intersite Indisponible ! -> Je passe maitre Nagios
	# return : 6 -> Instance Nagios Local OK -> Le lien intersite est revenu UP !
	# return : 7 -> Instance Nagios Local NON OK -> Je reste maitre de l'instance Nagios !
	# return : 8 -> Le script n'est pas executé pour tester l'instance Nagios en Local
	echo "CURRENT_HOST == $CURRENT_HOST         HOST == $HOST" >> $LOGFILE
	if [ "$CURRENT_HOST" != "$HOST" ] ; then
		if [ "$INTERSITE" = up ] ; then
			if Fonction_test_intersite ; then
				if Fonction_dist_nagios ; then
					if [ "$CURRENT_STATE_NAGIOS_MASTER" = "$CURRENT_HOST" ] ; then
						if [ "$START_STATE_NAGIOS_MASTER" = "$CURRENT_HOST" ] ; then
							return 3
						else 
							return 2
						fi
					else
						return 1
					fi
				else
					return 4
				fi
			else
				return 5
			fi
		else
			if Fonction_test_intersite ; then
				return 6
			else
				return 7
			fi
		fi
	else
		return 8
	fi
}
 
# FONCTION_MODIF_CONF_ESCALVE
# Fonction permettant le passage en mode ESCLAVE ! 
# En mode Esclave, Nagios n'effectue pas de Check, il reçoit les statuts
# des hôtes et services par OCHP/OCSP depuis le Maitre Nagios.
# Exception : pour la bascule esclave -> maître, le check nagios 
# sur l'esclave est le seul actif, mais il n'envoie pas de notification 
# par OSCP/OCHP à Wallace et Gromit.
Fonction_modif_conf_esclave ()
{
	echo -e "start_state_nagios_master $START_STATE_NAGIOS_MASTER \ncurrent_state_nagios_master $DIST_HOST \nlien_intersite up" > /nagios/etc/check_nagios_master_synchro.cfg
	#Fonction_stop_start esclave
}
 
# FONCTION_MODIF_CONF_INTERSITE_UP
# Cette fonction permet la modification de la variable "intersite" du fichier de configuration "check_nagios_master_synchro.cfg"
Fonction_modif_conf_intersite_up ()
{
	sed "s/intersite\ down/intersite\ up/" ${CONF_NAGIOS}check_nagios_master_synchro.cfg > ${CONF_NAGIOS}check_nagios_master_synchro.tmp && mv -f ${CONF_NAGIOS}check_nagios_master_synchro.tmp ${CONF_NAGIOS}check_nagios_master_synchro.cfg
}
 
###################
# DEBUT DU SCRIPT #
###################
Fonction_current_host
Fonction_initialisation $TYPE
Fonction_Test_Master
case $? in
	1) # Je reste Esclave
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] L'instance NAGIOS sur $CURRENT_HOST reste Esclave" | tee -a $LOGFILE
		exit 0
	;;
	2) # Je passe Escalve
		Fonction_modif_conf_esclave
		Fonction_stop_start esclave
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] L'instance NAGIOS sur $CURRENT_HOST passe Esclave" | tee -a $LOGFILE
		exit 0
	;;
	3) # Je reste Maître 
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] L'instance NAGIOS sur $CURRENT_HOST reste Maitre" | tee -a $LOGFILE
		exit 0
	;;
	4) # ALERTE Nagios distant indisponible ! -> Je passe Maitre Nagios LOCAL (script enable_master)
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') Nagios distant indisponible" >> $LOGFILE
		echo "Nagios_distant_indisponible"
		exit 2
	;;
	5) # ALERTE Lien Intersite Indisponible ! -> Je passe Maitre Nagios LOCAL (script enable_master)
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') Lien intersite indisponible" >> $LOGFILE
		echo "Lien_intersite_indisponible"
		exit 2
	;;
	6) # Le lien intersite est revenu UP :
	   # 1 - Je modifie la conf du fichier check_nagios_master_synchro.cfg
	   # 2 - J'appelle le script en récursif pour ne pas rester dans un état Maître/Maître 
		Fonction_modif_conf_intersite_up
                echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Le lien intersite est revenu UP -> j'active les checks distant" | tee -a $LOGFILE
		${LIBEXEC}contrib/check_remote_nagios2 $USER $HOST $USER3 $USER4 $SW_SITE_A $SW_SITE_B
		exit $?
	;;
	7) # ACTION : 7 -> Instance Nagios LOCAL OK -> Je reste maitre de l'instance Nagios LOCAL
		echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [check_remote_nagios2] Instance Nagios Local OK -> je reste maitre de l'instance Nagios local" | tee -a $LOGFILE
		exit 1
	;;
	8) # Le script ne s'applique pas à l'hôte local
                echo "[$(date +'%s')]->$(date +'%d/%m/%Y-%H:%M:%S') [RATPcheck_remote_nagios2] L'instance NAGIOS de $CURRENT_HOST est $TYPE"| tee -a $LOGFILE
 
		exit 0
	;;
	*)
	echo "Erreur"
	exit 2
	;;
esac

Script B

#!/bin/bash
#
#############################################################
# 
# Script de changement d'état "Esclave" -> "Maitre" pour Nagios
#
# Réalisé par Julien 05-10-2010
#
#
#############################################################
#set -x
 
SERVICE_OUTPUT=$1
 
LOGFILE="/var/log/nagios/nagios.log"
LIBEXEC=/nagios/libexec/
CONF_NAGIOS=/nagios/etc/
SITE_A="ServeurWEB_Bordeaux"
SITE_B="ServeurWEB_Lyon"
SITE_AUTRE="AUTRES"
 
CURRENT_HOST=`hostname | awk -F . '{print $1}'`
START_STATE_NAGIOS_MASTER=`grep start_state_nagios_master /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
CURRENT_STATE_NAGIOS_MASTER=`grep current_state_nagios_master /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
INTERSITE=`grep intersite /nagios/etc/check_nagios_master_synchro.cfg | awk '{print $NF}'`
LISTE_HOSTGROUP=`egrep '(hostgroup_name.*${SITE_A}|hostgroup_name.*${SITE_B})' ${CONF_NAGIOS}hostgroups.cfg | awk '{print $NF}'`
LISTE_HOSTGROUP_AUTRES=`egrep '(hostgroup_name.*${SITE_AUTRE})' ${CONF_NAGIOS}hostgroups.cfg | awk '{print $NF}'`
# Concatenation de variables
LISTE_HOSTGROUP="$LISTE_HOSTGROUP $LISTE_HOSTGROUP_AUTRES"
 
# FONCTION_MODIF_CONF_MAITRE 
# Cette fonction permet de passer en mode maître
Fonction_modif_conf_maitre ()
{
	#### ACTIVATION des send_nsca ####
        sed "s/^#\/usr\/bin\/printf/\/usr\/bin\/printf/g" ${LIBEXEC}submit_check_result_host > ${LIBEXEC}submit_check_result_host.tmp && mv -f ${LIBEXEC}submit_check_result_host.tmp ${LIBEXEC}submit_check_result_host
	chmod 755 ${LIBEXEC}submit_check_result_host
        sed "s/^#\/usr\/bin\/printf/\/usr\/bin\/printf/g" ${LIBEXEC}submit_check_result > ${LIBEXEC}submit_check_result.tmp && mv -f ${LIBEXEC}submit_check_result.tmp ${LIBEXEC}submit_check_result
	chmod 755 ${LIBEXEC}submit_check_result
 
	# Appel des scripts de D'ACTIVATION des checks pour toute la DMZ (ou les deux sites)
	for i in $LISTE_HOSTGROUP
	do
		# Disables passive checks for all services associated with hosts in a particular hostgroup
    		${LIBEXEC}contrib/disable_hostgroup_passive_svc_checks $i
		echo "[$(date +'%s')] ${LIBEXEC}contrib/disable_hostgroup_passive_svc_checks $i" >> $LOGFILE
 
		# Disables passive checks for all hosts in a particular hostgroup
    		${LIBEXEC}contribp/disable_hostgroup_passive_host_checks $i
		echo "[$(date +'%s')] ${LIBEXEC}contrib/disable_hostgroup_passive_host_checks $i" >> $LOGFILE
 
		# Enables active checks for all services associated with hosts in a particular hostgroup
		${LIBEXEC}contrib/enable_hostgroup_active_svc_checks $i
		echo "[$(date +'%s')] ${LIBEXEC}contrib/enable_hostgroup_active_svc_checks $i" >> $LOGFILE
 
		# Enables active checks for all hosts in a particular hostgroup
		${LIBEXEC}contrib/enable_hostgroup_active_host_checks $i
		echo "[$(date +'%s')] ${LIBEXEC}contrib/enable_hostgroup_active_host_checks $i" >> $LOGFILE
	done
}
 
# TEST pour modification de fichier du Nagios Master
Fonction_Test_Master ()
{
	# ACTION : 0 -> je passe Maitre
	# ACTION : 1 -> je reste Maitre
	if [ "$CURRENT_STATE_NAGIOS_MASTER" != "$CURRENT_HOST" ] ; then
		ACTION=0
		return $ACTION
	else
		ACTION=1
		return $ACTION
	fi
}
 
Fonction_Test_Intersite ()
{
	# ACTION : 1 -> je change le parametre "intersite" du fichier de conf
	# ACTION : 2 -> le lien intersite est DOWN -> je reste maitre local 
	if [ "$INTERSITE" = up ] ; then
		ACTION=0
		return $ACTION
	else
		ACTION=1
		return $ACTION
	fi
}
 
case $SERVICE_OUTPUT in
	"Nagios_distant_indisponible") 
		if Fonction_Test_Master ; then
			# Je passe Nagios Maître avec le lien intersite UP
			echo -e "start_state_nagios_master $START_STATE_NAGIOS_MASTER \ncurrent_state_nagios_master $CURRENT_HOST \nlien_intersite up" > ${CONF_NAGIOS}check_nagios_master_synchro.cfg
			Fonction_modif_conf_maitre
			echo "[$(date +'%s')] [enable_master] L'instance NAGIOS sur $CURRENT_HOST passe Maitre : Nagios distant indisponible"  >> $LOGFILE
			exit 0
		else # je reste Nagios Maître avec le lien intersite UP
			echo "[$(date +'%s')] [enable_master] L'instance NAGIOS sur $CURRENT_HOST reste Maitre : Nagios distant indisponible"  >> $LOGFILE
			exit 0
		fi
	;;
	"Lien_intersite_indisponible") 
		if Fonction_Test_Intersite ; then
			# Je passe Nagios Maître avec le lien intersite DOWN
			echo -e "start_state_nagios_master $START_STATE_NAGIOS_MASTER \ncurrent_state_nagios_master $CURRENT_HOST \nlien_intersite down" > ${CONF_NAGIOS}check_nagios_master_synchro.cfg
			Fonction_modif_conf_maitre
			echo "[$(date +'%s')] [enable_master] L'instance NAGIOS sur $CURRENT_HOST passe Maitre : Lien intersite indisponible"  >> $LOGFILE
			exit 0
		else # je reste Nagios Maître avec le lien intersite DOWN
			echo -e "start_state_nagios_master $START_STATE_NAGIOS_MASTER \ncurrent_state_nagios_master $CURRENT_HOST \nlien_intersite down" > ${CONF_NAGIOS}check_nagios_master_synchro.cfg
			echo "[$(date +'%s')] [enable_master] L'instance NAGIOS sur $CURRENT_HOST reste Maitre : Lien intersite indisponible"  >> $LOGFILE
			exit 0
		fi
	;;
	*)
		echo "[$(date +'%s')] [enable_master] Le fonctionnement NAGIOS en Mode Maître / Esclave reste DEGRADE"  >> $LOGFILE
	;;
esac

Synchronisation des statuts via send_nsca

Dans l’architecture haute disponibilité, c’est l’instance Nagios Maître qui effectue les « Script de Check » de surveillance. Le Maître est le seul à connaître l’état et le statut des « hosts » et « services ». Il envoie les statuts des « hosts » et « services » via le protocole NSCA (commande send_nsca) au Nagios Esclave.

Quand un « Checks Nagios » de surveillance est exécuté le résultat est stocké dans un fichier de statut (voir la directive « status_file » du fichier de configuration nagios.cfg). Si le statut est différent de celui stocké dans le fichier de statut, les commandes OSCP et OCHP sont exécutées.

Les commandes OSCP et OCHP sont configurées dans le fichier de configuration principale “nagios.cfg”.

ocsp_command=submit_check_result
ochp_command=submit_check_result_host
Les commandes OSCP et OCHP sont des scripts :
root@nagios_A:/usr/nagios/libexec# cat submit_check_result
#!/bin/sh
# Arguments:
#  $1 = host_name (Short name of host that the service is
#       associated with)
#  $2 = svc_description (Description of the service)
#  $3 = svc_state_string (A string representing the status of
#       the given service - "OK", "WARNING", "CRITICAL"
#       or "UNKNOWN")
#  $4 = svc_state_type (A string representing the status of
#       the given service - "SOFT", "HARD")
#  $5 = plugin_output (A text string that should be used
#       as the plugin output for the service checks)
#
 
HOST1="nagios_B"
 
# Convert the state string to the corresponding return code
return_code=-1
 
case "$3" in
    OK)
        return_code=0
    ;;
    WARNING)
        return_code=1
    ;;
    CRITICAL)
        if [ "$4" == "SOFT" ]
        then
            exit 0
        fi
        return_code=2
    ;;
    UNKNOWN)
        return_code=-1
    ;;
esac
 
# pipe the service check info into the send_nsca program, which
# in turn transmits the data to the nsca daemon on the central
# monitoring server
 
/usr/bin/printf "%s\t%s\t%s\t%s\n" "$1" "$2" "$return_code" "$5" | /nagios/bin/send_nsca -H $HOST1 -to 40 -c /nagios
Pour interpréter les “send_nsca” l'instance Nagios passive doit déclarer les « hosts » et « services » en tant que « Check passif »
passive_checks_enabled		1

Changement manuel du Maître

Il est possible de changer le Maître en Esclave ou l’inverse en mettant à jour manuellement une des deux configurations suivantes dans le fichier de configuration check_nagios_master_synchro.cfg :

start_state_nagios_master 	nagios_B
current_state_nagios_master 	nagios_B
lien_intersite 			up
Attention : Le changement manuel d’état Maître / Escalve implique un redémarrage de Nagios et doit être fait en moins de 6 mins par serveur en raison de la variable TIME_EXECUTE=360 de la fonction Fonction_initilalisation du script de Hautes Disponibilités Script A.

 
asr/sys/nagios/architecture_haute_disponibilite_nagios.txt · Dernière modification: 2016/03/29 23:37 (édition externe)
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki