Sur l'iDRAC d'un serveur Dell, je veux récupérer l'état d'un composant en utilisant le protocole SNMP. Dell complète les bases de données standardisées interrogeables en SNMP avec la sienne (ce qu'on nomme un module MIB, l'ensemble des bases de données agrégées sous forme arborescente est nommée MIB).
Première question : comment connaître l'OID (l'identifiant unique) d'un objet défini dans un module MIB afin de le consulter en SNMP ?
Généralement, chercher le nom de l'objet sur un moteur de recherche web suffit. Dans mon cas, chercher « systemStateIDSDMCardDeviceStatusList » conduit à des résultats fort bien présentés : oidref et observium.org. L'OID est 1.3.6.1.4.1.674.10892.5.4.200.10.1.61
Mais si l'on veut trouver par nous-même, au cas où une MIB ne soit pas aussi bien indexée ?
Le début d'un OID est normalisé : .1.3.6.1. .1.3.6.1.2.1 pour la très populaire MIB-II. .1.3.6.1.4.1 pour les sociétés commerciales privées. Mais la suite dépend de Dell (dans mon cas).
On peut télécharger la MIB et l'étudier avec un éditeur de texte. On cherche notre objet par son nom (« systemStateIDSDMCardDeviceStatusList » dans mon cas). On lit « ::= { systemStateTableEntry 61 } ». Cet objet a donc l'ID 61 relativement à l'objet « systemStateTableEntry ». On remonte l'arborescence : l'objet « systemStateTableEntry » a l'ID 1 relativement à l'objet « systemStateTable » qui, lui-même, a l'ID 10 relativement à l'objet « systemStateGroup » qui a l'ID 1.3.6.1.4.1.674.10892.5.4.200. L'OID absolu que nous cherchons est donc 1.3.6.1.4.1.674.10892.5.4.200 + .10.1.61 + .1 soit 1.3.6.1.4.1.674.10892.5.4.200.10.1.61.1. Pourquoi j'ai ajouté un « 1 » à la fin ? Car c'est comme ça que l'on consulte la case d'un tableau en SNMP.
Et si l'on n'a pas envie de s'embêter avec ce que je viens de raconter ? On utilise le logiciel snmptranslate
de la trousse à outils net-snmp (nom du paquet Debian : snmp). Tout est dans la documentation, mais je vais répéter :
snmptranslate -Dinit_mib .1.3 2>&1 | grep MIBDIR
. Sous Debian, il y a des chemins dans /usr/share (si l'on dépose une MIB dedans, le dossier ne sera pas supprimé quand on supprimera le paquet snmp…) et ~/.snmp/mibs ;mkdir -p ~/.snmp/mibs
;snmp-mibs-downloader
car tous les modules MIB ne sont pas libres. Les MIBs seront téléchargées durant l'installation du paquet ;snmptranslate -IR -On IDRAC-MIB-SMIv2:systemStateIDSDMCardDeviceStatusList
.
Deuxième question : comment charger / ajouter une MIB à snmpget
/ snmpwalk
afin d'utiliser le nom d'un objet pour y accéder ?
Nous venons de faire cela pour répondre à la question précédente.
Nous pouvons récupérer la valeur d'un objet à partir de son nom : snmpget -v2c -c <COMMUNAUTÉ> <nom_DNS_iDRAC> IDRAC-MIB-SMIv2:systemStateIDSDMCardDeviceStatusList.1
(là non plus, on n'oublie pas le « .1 » final afin d'entrer dans la case du tableau).
On peut toujours récupérer la valeur de l'objet à partir de l'OID qu'on a trouvé ci-dessus : snmpget -v2c -c <COMMUNAUTÉ> <nom_DNS_iDRAC> 1.3.6.1.4.1.674.10892.5.4.200.10.1.61.1
.
Et si l'on veut que snmpget
/ snmpwalk
résolvent le nom d'un OID pour nous ? snmpwalk -m +IDRAC-MIB-SMIv2 -v2c -c <COMMUNAUTÉ> <nom_DNS_iDRAC> 1.3.6.1.4.1.674.10892.5.4.200.10.1
. Et si préciser « -m +IDRAC-MIB-SMIv2 » est trop pénible, tu remplaces la ligne « mibs : » par « mibs +IDRAC-MIB-SMIv2 » dans /etc/snmp/snmp.conf
.