Both sides previous revisionPrevious revisionNext revision | Previous revision |
informatique:logiciels:nagios [2015/09/03 08:37] – refonte structure des titres pteu | informatique:logiciels:nagios [2021/01/15 15:47] (current) – [Contrôler Nagios en CLI] nagios_downtime_w_childs.sh pteu |
---|
| |
* Choisir le mode de fonctionnement de pnp4nagios (cf http://docs.pnp4nagios.org/fr/pnp-0.6/modes). Dans mon cas ça sera le **mode synchronisé** car c'est ce qui est conseillé pour les petites installations (< 1000 services). | * Choisir le mode de fonctionnement de pnp4nagios (cf http://docs.pnp4nagios.org/fr/pnp-0.6/modes). Dans mon cas ça sera le **mode synchronisé** car c'est ce qui est conseillé pour les petites installations (< 1000 services). |
| <WRAP center round info 60%> |
| Note : ce mode semble buggué sur Debian 9 / Nagios 4.3.4 / PNP 0.6.26, utiliser plutôt d'autres modes (bulk par exemple) |
| </WRAP> |
| |
* Configurer Nagios pour qu'il fasse appel à PNP4Nagios : | * Configurer Nagios pour qu'il fasse appel à PNP4Nagios : |
<code bash> | <code bash> |
ln -s /usr/share/doc/pnp4nagios/examples/ssi/status-header.ssi /usr/share/nagios3/htdocs/ssi/ | ln -s /usr/share/doc/pnp4nagios/examples/ssi/status-header.ssi /usr/share/nagios3/htdocs/ssi/ |
| |
| # ou, avec un Nagios/PNP récemment compilée : |
| cp /home/dude/src/pnp4nagios-0.6.26/contrib/ssi/status-header.ssi /usr/local/pnp4nagios/share/ |
| ln -s /usr/local/pnp4nagios/share/status-header.ssi /usr/local/nagios/share/ssi/ |
</code> | </code> |
| |
<code bash> | <code bash> |
vi cgi.cfg | vi cgi.cfg |
action_url_target=main | action_url_target=_self |
</code> | </code> |
| |
<code bash> | <code bash> |
service nagios3 restart | service nagios3 restart |
| # OU |
| systemctl restart nagios |
</code> | </code> |
| |
{{ :informatique:logiciels:template_pnp4nagios.png?direct |}} | {{ :informatique:logiciels:template_pnp4nagios.png?direct |}} |
| |
Pour chaque service disposant de perfdata et sur lequel PNP4nagios est activé, le plugin va rechercher son template éponyme avec l'extension ".php" dans les répertoires suivants (et dans cet ordre) : | Pour chaque service disposant de perfdata et sur lequel PNP4nagios est activé, le plugin va rechercher un template éponyme du nom de sa commande (''command_name'' dans la définition de la commande), avec l'extension ".php", dans les répertoires suivants (et dans cet ordre) : |
<code bash> | <code bash> |
# avec le paquet pnp4nagios sous debian 7 : | # avec le paquet pnp4nagios sous debian 7 : |
</code> | </code> |
| |
Par exemple pour un service "check_syno_4disks_temp" il recherchera le template check_syno_4disks_temp.php. S'il ne le trouve pas il appliquera le template ''default.php'' qui trace une courbe par valeur. Il va ensuite créer un fichier XML qui contiendra les perfdata, dans le même répertoire que la base RRD : ''/var/lib/pnp4nagios/perfdata/<host>'' (ou ''/usr/local/pnp4nagios/var/perfdata/'' si pnp4nagios a été installé à partir les sources). | Par exemple pour un service "check-syno-4disks-temp" appelant la commande la commande "check_syno_4disks_temp" (''check_command check_syno_4disks_temp!public''), il recherchera le template **check_syno_4disks_temp.php**. S'il ne le trouve pas il appliquera le template ''default.php'' qui trace une courbe par valeur. Il va ensuite créer un fichier XML qui contiendra les perfdata, dans le même répertoire que la base RRD : ''/var/lib/pnp4nagios/perfdata/<host>'' (ou ''/usr/local/pnp4nagios/var/perfdata/'' si pnp4nagios a été installé à partir les sources). |
| |
====Exemple 1 : trafic in/out==== | ====Exemple 1 : trafic in/out==== |
| |
# trafic reseau | # trafic reseau |
# le plugin avec l'option "--rate" a besoin de creer acceder au repertoire : /usr/var/105/check_snmp | |
# -> penser à faire : #chmod 755 /usr/var && mkdir /usr/var/105/check_snmp && chown -R nagios /usr/var/105/check_snmp | |
# -o est suivi par les 2 OIDs correspondant au trafic in et out de l'interface que l'on veut superviser | # -o est suivi par les 2 OIDs correspondant au trafic in et out de l'interface que l'on veut superviser |
# -l permet d'afficher une légende | # -l permet d'afficher une légende |
# -P précise la version de SNMP | # -P précise la version de SNMP |
# -C spécifie la communauté SNMP | # -C spécifie la communauté SNMP |
| # --rate induqe qu'il s'agit d'un compteur qui nécessite donc un calcul \ |
| # par rapport à la précédente valeur (voir plus bas pour l'explication) |
define command{ | define command{ |
command_name check_syno_traf-eth0 | command_name check_syno_traf-eth0 |
command_line $USER1$/check_snmp -H '$HOSTADDRESS$' -P 2c -C '$ARG1$' -l eth0_in,eth0_out -u bytes,bytes --rate -o .1.3.6.1.2.1.31.1.1.1.6.3,.1.3.6.1.2.1.31.1.1.1.10.3 | command_line $USER1$/check_snmp -H '$HOSTADDRESS$' -P 2c -C '$ARG1$' -l eth0_in,eth0_out \ |
| -u bytes,bytes --rate -o .1.3.6.1.2.1.31.1.1.1.6.3,.1.3.6.1.2.1.31.1.1.1.10.3 |
} | } |
| </code> |
| NB : le plugin **check_snmp** avec l'option ''<nowiki>--</nowiki>rate'' a besoin d'accéder a un répertoire dans lequel il enregistre les compteurs n-1 pour calculer le débit réseau : ce répertoir varie selon le mode d'installation et les distributions : |
| * sous Debian j'ai eu ''/usr/var/105/check_snmp'' (il faut le trouver !) ; |
| * sous centOS c'est ''/var/check_snmp'' ; |
| * ça peut aussi être ''/usr/local/nagios/var/check_snmp'' |
| Pour ne pas avoir d'erreur de permission (Cannot create temporary filename) il faut penser à donner à Nagios les permissions en écriture sur ce répertoire ; par ex pour Debian : |
| <code bash> |
| chmod 755 /usr/var && mkdir /usr/var/105/check_snmp && chown -R nagios /usr/var/105/check_snmp |
</code> | </code> |
| |
$def[1] .= "GPRINT:var2:AVERAGE:\"%7.2lf %SB/s avg\" " ; | $def[1] .= "GPRINT:var2:AVERAGE:\"%7.2lf %SB/s avg\" " ; |
$def[1] .= "GPRINT:var2:MAX:\"%7.2lf %SB/s max\\n\" " | $def[1] .= "GPRINT:var2:MAX:\"%7.2lf %SB/s max\\n\" " |
| |
| # pour afficher le dernier check sur le graphe |
| if($this->MACRO['TIMET'] != ""){ |
| $def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" "; |
| } |
?> | ?> |
</code> | </code> |
{{ :informatique:logiciels:trafic_internet.png?direct |}} | {{ :informatique:logiciels:trafic_internet.png?direct |}} |
| |
| Le même, un peu plus perfectionné : |
| <code php> |
| <?php |
| # Copyright (c) 2006-2010 Joerg Linge (http://www.pnp4nagios.org) |
| # Plugin: check_snmp_int.pl (COUNTER) |
| # modif traffic reseau in/out |
| |
| $unit = "bps"; |
| |
| $ds_name[1] = "$hostname In/Out $unit"; |
| $opt[1] = " --vertical-label $unit -b 1000 --title \"$hostname : $servicedesc\" "; |
| $def[1] = rrd::def("var1",$RRDFILE[1],$DS[1],"AVERAGE"); |
| $def[1] .= rrd::def("var2",$RRDFILE[2],$DS[2],"AVERAGE"); |
| |
| #$def[1] .= "AREA:var1#99ff99:\"$NAME[1] \" " ; |
| $def[1] .= rrd::gradient('var1','ebffeb','99ff99',sprintf("%-16s",$NAME[1]),20); |
| $def[1] .= rrd::gprint('var1',array("LAST","AVERAGE","MAX"),"%3.2lf %s$unit"); |
| |
| $def[1] .= "LINE1:var2#0099ff:\"".sprintf("%-15s",$NAME[2])." \" " ; |
| $def[1] .= rrd::gprint('var2',array("LAST","AVERAGE","MAX"),"%3.2lf %s$unit"); |
| |
| if($this->MACRO['TIMET'] != ""){ |
| $def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" "; |
| } |
| ?> |
| |
| </code> |
====Exemple 2 : courbe CPU==== | ====Exemple 2 : courbe CPU==== |
| |
{{ :informatique:logiciels:cpu_forti.png?direct |}} | {{ :informatique:logiciels:cpu_forti.png?direct |}} |
| |
| ====Exemple 3 : graphique adaptatif==== |
| |
| Ce template va détecter automatiquement le nombre d'enregistrement dans la base RRD et s'adapter pour tracer le bon nombre de courbe (inconnue à l'avance). |
| <code bash> |
| <?php |
| $unit = "pc"; |
| |
| # max : 7 entrées |
| $TAB_COLORS = array('#ff0000','#ff8000','#cccc00','#0066ff','#9933ff','#00ff55','#ff80ff'); |
| $CPT=1; |
| |
| $ds_name[$CPT] = "$hostname %CPU x10"; |
| $opt[$CPT] = " --vertical-label $unit -b 1000 --title \"$hostname : $servicedesc (% x10)\" "; |
| |
| foreach ($this->DS as $CHAMP_RRD=>$VAL) { |
| |
| if ($CPT == "1") { |
| $def[1] = rrd::def("var".$CPT,$VAL['RRDFILE'],$VAL['DS'],"AVERAGE"); |
| } |
| else { |
| $def[1] .= rrd::def("var".$CPT,$VAL['RRDFILE'],$VAL['DS'],"AVERAGE"); |
| } |
| |
| $def[1] .= "LINE1:var".$CPT.$TAB_COLORS[$CHAMP_RRD].":\"".sprintf("%-15s",$VAL['NAME'])." \" " ; |
| $def[1] .= rrd::gprint('var'.$CPT,array("LAST","AVERAGE","MAX"),"%3.2lf %s$unit"); |
| |
| $CPT++; |
| } |
| |
| if($this->MACRO['TIMET'] != ""){ |
| $def[1] .= "VRULE:".$this->MACRO['TIMET']."#000000:\"Last Service Check \\n\" "; |
| } |
| ?> |
| |
| </code> |
| |
======Tips====== | ======Tips====== |
</code> | </code> |
| |
* pour une raison qui m'est inconnue, le plugin **check_snmp** (quand utilisé avec l'option "--rate") enregistre ses états non plus dans ''/usr/var/check_snmp'' mais dans ''/usr/var/105/check_snmp'' ! Une réminiscence d'IA caractérielle, une portion de code spontané ? En tout cas on va lui créer son répertoire car il n'a pas les droits pour le faire seul : | * pour une raison qui m'est inconnue, le plugin **check_snmp** (quand utilisé avec l'option ''<nowiki>--rate</nowiki>'') enregistre ses états non plus dans ''/usr/var/check_snmp'' mais dans ''/usr/var/105/check_snmp'' ! Une réminiscence d'IA caractérielle, une portion de code spontané ? En tout cas on va lui créer son répertoire car il n'a pas les droits pour le faire seul : |
<code bash> | <code bash> |
mkdir /usr/var/105 | mkdir /usr/var/105 |
[Thu Sep 3 10:29:38 2015] Auto-save of retention data completed successfully. | [Thu Sep 3 10:29:38 2015] Auto-save of retention data completed successfully. |
</code> | </code> |
| |
| |
| |
| =====Contrôler Nagios en CLI===== |
| |
| Grâce au commandes externes, on peut envoyer des ordres à Nagios via la ligne de commande, ce qui va plus vite que l'interface web dès qu'on donne beaucoup d'ordres :) Pour cela il suffit d'utiliser l'API/la syntaxe documentée ici : [[https://assets.nagios.com/downloads/nagioscore/docs/externalcmds/|Nagios Core External Commands]]. |
| |
| Exemples de scripts inspirés de ceux de la doc : |
| * ''nagios_downtime-host-and-childs.sh'' : permet de planifier un DOWNTIME à partir de maintenant pour un ou des hosts et tous ces childs. |
| <code bash nagios_downtime-host-and-childs.sh> |
| #!/bin/bash |
| # This is a sample shell script showing how you can submit the SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME command |
| # to Nagios. Adjust variables to fit your environment as necessary. |
| |
| [ -z "$3" ] && { echo "Syntaxe: ${O##*/} <duree_secs> <commentaire> <host> {<host2> <host3> etc..}"; exit 1; } |
| |
| now=`date +%s` |
| commandfile='/var/nagios/rw/nagios.cmd' |
| end=`expr $now + $1` |
| comment="$2" |
| shift 2 |
| |
| while [ -n "$1" ]; do |
| /usr/bin/printf "[%lu] SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;$3;$now;$end;1;0;7200;toto;$comment\n" $now > $commandfile |
| shift |
| done |
| </code> |
| |
| * permet de planifier un downtime pour un host et ses childs à un date donnée |
| <code bash nagios_downtime_w_childs.sh> |
| function usage { |
| echo "Usage: ${O##*/} <host> <date_debut> (format: \"%Y-%m-%d %H:%M:%S\")> <date_fin> \"<commentaire>\"" |
| echo " format dates: \"%Y-%m-%d %H:%M:%S\"" |
| echo " ex: nagios_downtime_w_childs.sh switch1 \"2021-01-15 07:18:00\" \"2021-01-15 07:48:00\" \"test downtime 30min\"" |
| exit 1 |
| } |
| |
| [ -z "$4" ] && usage |
| |
| now=$(date +%s) |
| commandfile='/var/nagios/rw/nagios.cmd' |
| |
| # affectation et contrôle des inputs |
| naghost=$1 |
| debut=$(date -d "$2" +%s 2>/dev/null) |
| [ -z "$debut" ] && { echo "Date début $2 invalide !"; usage; } |
| #[[ "$3" =~ ^[0-9]*$ ]] && fin=`expr $debut + $3` || { echo "ERR: Durée $3 invalide !"; usage; } |
| fin=$(date -d "$3" +%s 2>/dev/null) |
| [ -z "$fin" ] && { echo "Date fin $3 invalide !"; usage; } |
| comment="$4" |
| |
| /usr/bin/printf "[%lu] SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;$naghost;$debut;$fin;1;0;7200;toto;$comment\n" $now > $commandfile |
| </code> |
| =====Annuler des actions en masse===== |
| |
| //Préalable : il faut avoir activer les commandes externes (ce qui est bien souvent le cas...)// |
| |
| Pour annuler en masse certaines actions, on peut interagir avec le fichier de pipe nommé **nagios.cmd** (situé dans **/var/spool/nagios/cmd/** ; sinon voir le paramètre ''command_file'' dans **/etc/nagios/nagios.cfg**). |
| |
| Exemple pour supprimer des DOWNTIME planifiés pour un équipement et tous ses fils (soit une centaine de DOWNTIME) : |
| * on pourrait les supprimer un par un / clic par clic dans le menu "Downtime" ou ils sont listés, mais ça serait fastidieux ; au lieu de cela, repérer juste le premier et le dernier "Downtime ID" (1050 et 1150 dans mon cas) |
| * puis se connecter en SSH sur le serveur et lancer la commande : |
| <code bash> |
| for i in `seq 1050 1150`; do |
| printf "[%lu] DEL_HOST_DOWNTIME;$i\n" `date +%s` > /var/nagios/rw/nagios.cmd |
| done |
| </code> |
| Cela a pour effet d'envoyer des commandes qui seront lues par nagios ; l'effet n'est pas immédiat cela peut prendre quelques secondes/minutes. |
| |
| |