Supervision SMART de vos disques via Nagios

Date: 21/10/2011 | Catégories: Gstreamer,Hardware,Open-source,Reseau,Systeme | Tags: ,,,,

Disque durSuperviser l'espace disque des serveurs est une bonne chose... encore faut il que les données soient stockées sur des disques en bonne santé. Le but de ce billet est de mettre en place via Nagios/Shinken une supervision de l'état SMART renvoyé par l'outil Smartmontool.

Sur le serveur à superviser

Les pré-requis

La commande smartctl sera exécutée avec sudo, il faut donc l'installer si ce n'est pas déjà fait sur votre système:

[cce lang=bash"]

apt-get update

apt-get install sudo

[/cce]

Il fait aussi installer l'outil de vérification SMART : SmartMonTools.

[cce lang=bash"]

apt-get install smartmontools

[/cce]

Superviser quels disques ?

Pour savoir quels disques superviser, on peut utiliser la commande suivante (en root):

[cce lang=bash"]

fdisk -l

[/cce]

Exemple : sur un RAID1, on trouvera souvent /dev/sda et /dev/sdb. On prendra ce cas pour illustrer le reste de notre procédure.

Récupération et installation du plugin

Téléchargement du script :

[cce lang=bash"]

cd /etc/snmp/

wget https://raw.github.com/nicolargo/nagiosautoinstall/master/check_smart.pl

[/cce]

On donne les droits d'exécution :

[cce lang=bash"]

chmod 755 /etc/snmp/check_smart.pl

[/cce]

Modification de la configuration de SNMP

Pour prendre en compte Smart, il faut modifier la configuration de votre serveur SNMP (suivre cette procédure pour installer le serveur SNMPd sur votre machine) en éditant le fichier snmpd.conf et en y ajoutant les lignes suivantes :

[cce lang=bash"]

vi /etc/snmp/snmpd.conf

exec SmartSDA /etc/snmp/check_smart.pl -t -d /dev/sda

exec SmartSDB /etc/snmp/check_smart.pl -t -d /dev/sdb

[/cce]

Note : L'ordre des lignes est important !

La première ligne "exec" aura l'OID ".1.3.6.1.4.1.2021.8.1.101.1", la seconde ligne l'OID ".1.3.6.1.4.1.2021.8.1.101.2", etc...

Si vous utilisez déjà des commande exec dans le fichier snmpd.conf, les OID ne correspondront pas forcément avec ceux de cette procédure.

Redémarrage du service SNMP

[cce lang=bash"]

/etc/init.d/snmpd restart

[/cce]

Modification des sudoers

Il faut autoriser l'utilisateur snmp à exécuter la commande "/usr/sbin/smartctl".

Pour faire cela, il est nécessaire de modifier le fichier /etc/sudoers via la commande visudo et d'ajouter :

[cce lang=bash"]

snmp ALL= NOPASSWD:/usr/sbin/smartctl

[/cce]

Vérification du plugin

Pour voir si les résultats des checks sont bien rentrés dans la MIB SNMP du serveur, on teste avec cette commande :

[cce lang=bash"]

snmpwalk -c public -v 1 [IP du serveur à superviser] .1.3.6.1.4.1.2021.8.1

[/cce]

On devrait avoir quelque chose du genre :

UCD-SNMP-MIB::extIndex.1 = INTEGER: 1

UCD-SNMP-MIB::extIndex.2 = INTEGER: 2

UCD-SNMP-MIB::extNames.1 = STRING: SmartSDA

UCD-SNMP-MIB::extNames.2 = STRING: SmartSDB

UCD-SNMP-MIB::extCommand.1 = STRING: /etc/snmp/check_smart.pl

UCD-SNMP-MIB::extCommand.2 = STRING: /etc/snmp/check_smart.pl

UCD-SNMP-MIB::extResult.1 = INTEGER: 0

UCD-SNMP-MIB::extResult.2 = INTEGER: 0

UCD-SNMP-MIB::extOutput.1 = STRING: SMART overall-health self-assessment test result: PASSED

UCD-SNMP-MIB::extOutput.2 = STRING: SMART overall-health self-assessment test result: PASSED

UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)

UCD-SNMP-MIB::extErrFix.2 = INTEGER: noError(0)

UCD-SNMP-MIB::extErrFixCmd.1 = STRING:

UCD-SNMP-MIB::extErrFixCmd.2 = STRING:

L'état SMART du disque sda est remonté sur l'OID : .1.3.6.1.4.1.2021.8.1.101.1

L'état SMART du disque sdb est remonté sur l'OID : .1.3.6.1.4.1.2021.8.1.101.2

Sur le serveur Nagios

Création de la commande

On défini une nouvelle commande en ajoutant les lignes suivantes dans le fichier commands.cfg:

[cce lang=bash"]

define command{

command_name check_smart

command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C public -o $ARG1$ -r $ARG2$

;command_example !.1.3.6.1.4.1.2021.8.1.101.1!PASSED

}

[/cce]

Syntaxe de la commande :

• -H Hostaddress : IP ou nom DNS de la machine à superviser

• -C public : Communauté SNMP (on peut la mettre en variable si on veut)

• -o $ARG1$ : OID SNMP à intérroger

• -r $ARG2$ : Comparaison avec une chaine de caratère, ici "PASSED" (attention de respecter la casse). Si dans le retour du check, on ne trouve pas la chaine de caractère "PASSED", le service va passer en "Critical".

Exemple de service

On défini ensuite le service:

[cce lang=bash"]

define host{

use generic-host

host_name monserveur

alias Serveur_Zimbra

address 192.168.0.100

}

define service{

use generic-service

host_name monserveur

service_description SMART_sda

check_command check_smart!.1.3.6.1.4.1.2021.8.1.101.1!PASSED

}

[/cce]

Il ne reste plus qu'à redémarrer votre service Nagios ou Shinken pour prendre en compte la configuration:

[cce lang=bash"]

sudo /etc/init.d/nagios restart

[/cce]

  • merci bien, très utile
    je l’ajoute sur mes machines

  • Luc

    The same for NRPE use would be great. Can you help as I get « -bash: exec: SmartSDA: not found » when trying locally

    • Bonjour Luc,

      Le but ici est justement de ne pas utiliser NRPE. Pour un parc de plusieurs dizaines de serveurs à superviser, l’installation et la configuration de NRPE peut vite devenir une tache lourde.

      Pour en revenir à ton problème, que se passe t-il quand tu fais un :
      df -h

      et

      /etc/snmp/check_smart.pl -t -d /dev/sda

      Merci pour ton retour.
      Benj

      • Luc

        Je n’utilise pas snmp donc je ne peux pas faire cela. j’ai essayé avec ce que j’ai sous proxmox:

        root@hndb001:/usr/lib/nagios/plugins# df -h
        Filesystem Size Used Avail Use% Mounted on
        /dev/sda1 5.0G 1.1G 3.6G 24% /
        tmpfs 3.9G 0 3.9G 0% /lib/init/rw
        udev 10M 32K 10M 1% /dev
        tmpfs 3.9G 0 3.9G 0% /dev/shm
        /dev/sda2 683G 64G 585G 10% /var/lib/vz

        et
        root@hndb001:/usr/lib/nagios/plugins# perl check_smart.pl -t -d /dev/sda1
        Use of uninitialized value $out in print at check_smart.pl line 109, line 5.
        Use of uninitialized value $out in pattern match (m//) at check_smart.pl line 110, line 5.
        Use of uninitialized value $out in pattern match (m//) at check_smart.pl line 111, line 5.
        Use of uninitialized value $out in pattern match (m//) at check_smart.pl line 111, line 5.