1. Introduction

Tous les administrateurs, qu'ils soit système ou réseau, ont des tâches périodiques à faire pour contrôler l'état de leurs systèmes :

  • taux de remplissage du disque dur d'une machine ;
  • occupation mémoire de la machine ;
  • bande passante réseau utilisée ;

Bien sûr, une « vraie » supervision SNMP (de type Zabbix ou HP OpenView ou Nagios pour ne citer que les plus connues) permet de faire ce genre de tâche. Mais cette supervision a un coût :

  • il faut mettre en place une plateforme de supervision dédiée avec un opérateur (ou une équipe pour assurer le 24/24 7/7) qui surveille la supervision et qui sache réagir en fonction des événements ;
  • il faut spécifier exactement ce que l'on veut superviser mais aussi ce qu'il est possible de superviser, la supervision du remplissage des tablespace d'une base de données Oracle ne peut se faire qu'avec un agent Oracle installé avec la base de données ;
  • il faut écrire des procédures définissant ce qu'il convient de faire en cas d'événement spécifique ;
  • il faut configurer toutes les machines supervisées en installant et en configurant un agent SNMP ou installer un agent de supervision spécifique ;
  • et enfin, il faut configurer le logiciel de supervision pour qu'il réponde au besoin.

Ceci est très bien pour des grosses infrastructures mais n'y a t'il pas moyen de faire plus simple et plus « artisanal » avant de sortir la grosse artillerie ? C'est ce à quoi va tenter de répondre cet article en utilisant des scripts Perl couplé à des mesures SNMP.

Cet article n'a pas la prétention de présenter tous les besoins et d'y répondre. Il va simplement répondre à quelques besoins simples et ensuite, ce sera à vous d'imaginer la suite.

2. SNMP

Ce paragraphe n'est pas une présentation complète de SNMP. Pour ceux qui voudrait en savoir plus à ce sujet, il y a les articles suivants :

2-1. Modes de fonctionnement de SNMP

Il est important de noter une chose au sujet du fonctionnement de SNMP, il utilise deux modes de fonctionnement : le mode « monitoring » et le mode « alarming ».

Le mode « monitoring », c'est un agent SNMP installé sur une machine qui entretient une variable SNMP (un OID) avec la valeur courante (taux de remplissage du disque dur par exemple). C'est à dire que l'agent va périodiquement être mis à jour par le système d'exploitation avec la bonne valeur et il tient cette valeur à disposition de celui qui le demande. Il s'agit donc d'un mode synchrone et c'est en général effectué avec une requête SNMP de type « GET ».

Le mode « alarming » correspond à une alarme qui est envoyée par l'agent SNMP de la machine à son superviseur SNMP pour l'informer d'un événement exceptionnel (perte d'une interface réseau par exemple). Il s'agit donc d'un événement asynchrone et c'est en général effectué à l'aide d'une requête SNMP de type «TRAP ». Si cet événement n'est pas reçu ou pas traité, l'événement est perdu. En effet, il est rarement possible de demander l'historique des alarmes envoyées par un agent SNMP.

On voit donc bien que, pour tout ce qui est scripting (que ce soit en Perl, en bash ou en PHP), seul le mode « monitoring » est utile. En effet, pour utiliser le mode « alarming », il faudrait un service ou un démon qui soit toujours à l'écoute et cette problématique sort des objectifs visés par cet article.

2-2. Les OID

Un OID est un identifiant sous une forme décimale pointée (« .1.3.6.1.4.1.2021.2.1.1 » par exemple). Cet OID est instancié par l'agent et il est alors possible de demander à l'agent la valeur instantanée de cet OID.

Pour des raisons de facilité, il existe aussi des fichiers MIB qui donnent des informations textuelles et plus « humaines » sur cet OID. Une autre difficulté est de trouver le fichier MIB et croyez moi, ce n'est pas toujours facile.

A titre d'exemple, l'OID « .1.3.6.1.4.1.2021.2.1.1 » est défini dans le fichier MIB « UCD-SNMP-MIB.mib » et sa définition est :

 
Sélectionnez
prIndex OBJECT-TYPE
    SYNTAX    Integer32 (0..65535)
    MAX-ACCESS    read-only
    STATUS    current
    DESCRIPTION
    "Reference Index for each observed process."
    ::= { prEntry 1 }

2-3. Les agents SNMP utilisés dans cet article

Cet article s'appuie sur plusieurs agents SNMP pour les test :

Remarque : il existe aussi une version Net-SNMP directement compilée pour les environnements Microsoft Windows, se reporter sur cet article pour plus d'informations.

2-4. Que sait faire notre agent ?

Voilà, nous avons un besoin, nous avons installé un agent SNMP sur notre machine, maintenant, qu'est ce que sait faire cet agent SNMP et est-ce qu'il instancie un OID qui va permettre de répondre à notre problème.

Encore faut-il que notre agent instancie notre OID. Ce n'est pas toujours le cas suivant les fonctionnalités des agents installés sur la machine.

Nous allons donc commencer par interroger notre agent SNMP afin de récupérer la liste de tous les OID instanciés par cet agent. Ceci va se faire avec la commande snmpwalk par exemple.

Pour se connecter à un agent SNMP, il faut connaître les paramètres de connexion suivants :

  • son adresse IP (cela paraît évident) et éventuellement le port sur lequel il est à l'écoute (c'est souvent le port UDP 161) ;
  • la version de protocole supportée par cet agent. Actuellement, SNMP se décline en trois versions : les versions 1, 2c et 3 ;
  • ensuite, il faut connaître les paramètres d'identification et d'authentification. Pour les versions 1 et 2c, il s'agit du nom de communauté. Pour la version 3, il s'agit d'un vrai login/password avec en plus les noms des algorithmes cryptographiques utilisés.

Ces paramètres ne peuvent pas s'inventer, il faut les demander à l'administrateur de la machine concernée.

Voici par exemple le début résultat d'une commande snmpwalk sur un agent Net-SNMP d'une machine Linux :

 
Sélectionnez
.1.3.6.1.2.1.1.1.0 = STRING: Linux debian 2.6.32-5-686 #1 SMP Fri May 10 08:33:48 UTC 2013 i686
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10
.1.3.6.1.2.1.1.3.0 = Timeticks: (3812) 0:00:38.12
.1.3.6.1.2.1.1.4.0 = STRING: @@no.where
.1.3.6.1.2.1.1.5.0 = STRING: debian
.1.3.6.1.2.1.1.6.0 = STRING: Unknown
.1.3.6.1.2.1.1.7.0 = INTEGER: 72
.1.3.6.1.2.1.1.8.0 = Timeticks: (56) 0:00:00.56
.1.3.6.1.2.1.1.9.1.2.1 = OID: .1.3.6.1.6.3.11.3.1.1
.1.3.6.1.2.1.1.9.1.2.2 = OID: .1.3.6.1.6.3.15.2.1.1
.1.3.6.1.2.1.1.9.1.2.3 = OID: .1.3.6.1.6.3.10.3.1.1
.1.3.6.1.2.1.1.9.1.2.4 = OID: .1.3.6.1.6.3.1
.1.3.6.1.2.1.1.9.1.2.5 = OID: .1.3.6.1.2.1.49
.1.3.6.1.2.1.1.9.1.2.6 = OID: .1.3.6.1.2.1.4
.1.3.6.1.2.1.1.9.1.2.7 = OID: .1.3.6.1.2.1.50
.1.3.6.1.2.1.1.9.1.2.8 = OID: .1.3.6.1.6.3.16.2.2.1
.1.3.6.1.2.1.1.9.1.2.9 = OID: .1.3.6.1.6.3.13.3.1.3
.1.3.6.1.2.1.1.9.1.2.10 = OID: .1.3.6.1.2.1.92
.1.3.6.1.2.1.1.9.1.3.1 = STRING: The MIB for Message Processing and Dispatching.
.1.3.6.1.2.1.1.9.1.3.2 = STRING: The management information definitions for the SNMP User-based Security Model.
.1.3.6.1.2.1.1.9.1.3.3 = STRING: The SNMP Management Architecture MIB.
.1.3.6.1.2.1.1.9.1.3.4 = STRING: The MIB module for SNMPv2 entities
.1.3.6.1.2.1.1.9.1.3.5 = STRING: The MIB module for managing TCP implementations
.1.3.6.1.2.1.1.9.1.3.6 = STRING: The MIB module for managing IP and ICMP implementations
.1.3.6.1.2.1.1.9.1.3.7 = STRING: The MIB module for managing UDP implementations
.1.3.6.1.2.1.1.9.1.3.8 = STRING: View-based Access Control Model for SNMP.
.1.3.6.1.2.1.1.9.1.3.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
.1.3.6.1.2.1.1.9.1.3.10 = STRING: The MIB module for logging SNMP Notifications.
.1.3.6.1.2.1.1.9.1.4.1 = Timeticks: (42) 0:00:00.42
.1.3.6.1.2.1.1.9.1.4.2 = Timeticks: (42) 0:00:00.42
.1.3.6.1.2.1.1.9.1.4.3 = Timeticks: (42) 0:00:00.42
...

A titre de comparaison, voici le début résultat d'une commande snmpwalk sur l'agent SNMP par défaut d'une machine Windows 7 :

 
Sélectionnez
.1.3.6.1.2.1.1.1.0 = STRING: Hardware: Intel64 Family 6 Model 23 Stepping 10 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7601 Multiprocessor Free)
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.311.1.1.3.1.1
.1.3.6.1.2.1.1.3.0 = Timeticks: (1446) 0:00:14.46
.1.3.6.1.2.1.1.4.0 = STRING: ram-0000@redaction-developpez.com
.1.3.6.1.2.1.1.5.0 = STRING: Lumi.re
.1.3.6.1.2.1.1.6.0 = STRING: A la maison
.1.3.6.1.2.1.1.7.0 = INTEGER: 79
.1.3.6.1.2.1.2.1.0 = INTEGER: 26
.1.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1
.1.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2
.1.3.6.1.2.1.2.2.1.1.3 = INTEGER: 3
.1.3.6.1.2.1.2.2.1.1.4 = INTEGER: 4
.1.3.6.1.2.1.2.2.1.1.5 = INTEGER: 5
.1.3.6.1.2.1.2.2.1.1.6 = INTEGER: 6
.1.3.6.1.2.1.2.2.1.1.7 = INTEGER: 7
.1.3.6.1.2.1.2.2.1.1.8 = INTEGER: 8
.1.3.6.1.2.1.2.2.1.1.9 = INTEGER: 9
.1.3.6.1.2.1.2.2.1.1.10 = INTEGER: 10
.1.3.6.1.2.1.2.2.1.1.11 = INTEGER: 11
.1.3.6.1.2.1.2.2.1.1.12 = INTEGER: 12
.1.3.6.1.2.1.2.2.1.1.13 = INTEGER: 13
.1.3.6.1.2.1.2.2.1.1.14 = INTEGER: 14
.1.3.6.1.2.1.2.2.1.1.15 = INTEGER: 15
.1.3.6.1.2.1.2.2.1.1.16 = INTEGER: 16
.1.3.6.1.2.1.2.2.1.1.17 = INTEGER: 17
.1.3.6.1.2.1.2.2.1.1.18 = INTEGER: 18
.1.3.6.1.2.1.2.2.1.1.19 = INTEGER: 19
.1.3.6.1.2.1.2.2.1.1.20 = INTEGER: 20
.1.3.6.1.2.1.2.2.1.1.21 = INTEGER: 21
.1.3.6.1.2.1.2.2.1.1.22 = INTEGER: 22
.1.3.6.1.2.1.2.2.1.1.23 = INTEGER: 23
.1.3.6.1.2.1.2.2.1.1.24 = INTEGER: 24
.1.3.6.1.2.1.2.2.1.1.25 = INTEGER: 25
.1.3.6.1.2.1.2.2.1.1.26 = INTEGER: 26
.1.3.6.1.2.1.2.2.1.2.1 = STRING: Software Loopback Interface 1.
.1.3.6.1.2.1.2.2.1.2.2 = STRING: WAN Miniport (SSTP).
.1.3.6.1.2.1.2.2.1.2.3 = STRING: WAN Miniport (L2TP).
.1.3.6.1.2.1.2.2.1.2.4 = STRING: WAN Miniport (PPTP).
.1.3.6.1.2.1.2.2.1.2.5 = STRING: WAN Miniport (PPPOE).
.1.3.6.1.2.1.2.2.1.2.6 = STRING: WAN Miniport (IPv6).
.1.3.6.1.2.1.2.2.1.2.7 = STRING: WAN Miniport (Network Monitor).
.1.3.6.1.2.1.2.2.1.2.8 = STRING: WAN Miniport (IP).
.1.3.6.1.2.1.2.2.1.2.9 = STRING: RAS Async Adapter.
.1.3.6.1.2.1.2.2.1.2.10 = STRING: Connexion r.seau Intel(R) 82567V-2 Gigabit.
.1.3.6.1.2.1.2.2.1.2.11 = STRING: Teredo Tunneling Pseudo-Interface.
.1.3.6.1.2.1.2.2.1.2.12 = STRING: WAN Miniport (IKEv2).
.1.3.6.1.2.1.2.2.1.2.13 = STRING: Carte Microsoft ISATAP #2.
.1.3.6.1.2.1.2.2.1.2.14 = STRING: P.riph.rique Bluetooth (TDI protocole RFCOMM).
.1.3.6.1.2.1.2.2.1.2.15 = STRING: P.riph.rique Bluetooth (r.seau personnel).
.1.3.6.1.2.1.2.2.1.2.16 = STRING: Carte Microsoft ISATAP.
.1.3.6.1.2.1.2.2.1.2.17 = STRING: Carte Microsoft 6to4.
.1.3.6.1.2.1.2.2.1.2.18 = STRING: Connexion r.seau Intel(R) 82567V-2 Gigabit - VirtualBox Bridged Networking Driver Miniport.
.1.3.6.1.2.1.2.2.1.2.19 = STRING: VirtualBox Host-Only Ethernet Adapter.
.1.3.6.1.2.1.2.2.1.2.20 = STRING: WAN Miniport (Network Monitor)-QoS Packet Scheduler-0000.
.1.3.6.1.2.1.2.2.1.2.21 = STRING: WAN Miniport (IP)-QoS Packet Scheduler-0000.
.1.3.6.1.2.1.2.2.1.2.22 = STRING: WAN Miniport (IPv6)-QoS Packet Scheduler-0000.
.1.3.6.1.2.1.2.2.1.2.23 = STRING: VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000.
.1.3.6.1.2.1.2.2.1.2.24 = STRING: VirtualBox Host-Only Ethernet Adapter-WFP LightWeight Filter-0000.
.1.3.6.1.2.1.2.2.1.2.25 = STRING: Connexion r.seau Intel(R) 82567V-2 Gigabit - VirtualBox Bridged Networking Driver Miniport-QoS Packet Scheduler-0000.
.1.3.6.1.2.1.2.2.1.2.26 = STRING: Connexion r.seau Intel(R) 82567V-2 Gigabit - VirtualBox Bridged Networking Driver Miniport-WFP LightWeight Filter-0000.
.1.3.6.1.2.1.2.2.1.3.1 = INTEGER: softwareLoopback(24)
...

Ensuite, la chose la plus compliquée à trouver est, en fonction de notre besoin, le ou les OID que l'on va pouvoir interroger. Pour cela, il faut analyser les fichiers MIB des OID instanciés par l'agent que nous devons interroger.

2-5. Les fichiers MIB

C'est probablement la chose la plus compliquée à trouver : le ou les fichiers MIB des OID instanciés par l'agent SNMP.

Pour information, le site circitor référence environ 6 200 fichier MIB avec une fonction de recherche par OID.

Ainsi, si on recherche l'OID « .1.3.6.1.4.1.2021.2.1.1 » de notre exemple précédent, le site circitor nous indique qu'il est définit dans le fichier MIB UCD-SNMP-MIB et que le nom de cet OID telque défini dans ce fichier MIB est prIndex.

Voilà, nous somme prêt, nous avons toutes les informations nécessaires :

  • ce que nous devons faire ;
  • un agent SNMP configuré sur la machine à interroger ;
  • les paramètres de connexion à cet agent SNMP ;
  • la liste des OID instanciés par cet agent SNMP ;
  • un moyen pour trouver les fichier MIB correspondant à ces OID.

Il n'y a plus qu'à se lancer.

3. Perl et SNMP

Bla bla

4. Les besoins

Les paragraphes suivants sont les explications et les scripts Perl pour répondre aux besoins suivants :

  • taux de remplissage des disques durs ;
  • taux d'utilisation de la CPU ;
  • présence ou non d'un processus « vital » ;
  • utilisation de la bande passante réseau ;
  • ...

5. Taux de remplissage des disques durs

Cet exemple va consister à relever et afficher le taux de remplissage des disques durs d'une machine particulières.

5-1. Principe de la mesure

La mesure consiste à relever les OID SNMP ...

6. Taux d'utilisation de la CPU

Cet exemple va consister à relever le taux d'utilisation de la CPU d'une machine particulière.

6-1. Principe de la mesure

La mesure consiste à relever les OID SNMP ...

7. Présence ou non d'un processus « vital »

Cet exemple va consister à vérifier la présence ou non d'un processus « vital » sur une machine particulière.

7-1. Principe de la mesure

La mesure consiste à relever les OID SNMP ...

8. Utilisation de la bande passante réseau

Cet exemple va consister à mesurer la bande passante réseau utilisée par une machine particulière.

8-1. Principe de la mesure

La mesure consiste à relever les OID SNMP ...

9. Conclusions

Voilà, cet article est terminé, ...

9-1. Remerciements

Nous tenons à remercier ??? et ??? pour leurs relecture technique et orthographique.

N'hésitez pas à commenter cet article ! Commentez Donner une note à l'article (0)