18.7. Surveiller les performances avec Net-SNMP

Red Hat Enterprise Linux 7 inclut la suite de logiciels Net-SNMP, qui offre un agent flexible et extensible ou simple network management protocol (SNMP). Cet agent et ses utilitaires associés peuvent être utilisés pour fournir des données de performance à partir d'un grand nombre de systèmes sur une variété d'outils qui prennent en charge les interrogations via le protocole SNMP.
Cette section fournit des informations sur la configuration de l'agent Net-SNMP pour fournir des données de performance sur le réseau de manière sécurisée, sur la récupération de données en utilisant le protocole SNMP, et sur l'extension de l'agent SNMP pour fournir des indicateurs de performance personnalisés.

18.7.1. Installer Net-SNMP

La suite de logiciels Net-SNMP est disponible en tant qu'ensemble de paquets RPM dans la distribution de logiciels Red Hat Enterprise Linux. Tableau 18.2, « Paquets Net-SNMP disponibles » résume chacun des paquets et son contenu.

Tableau 18.2. Paquets Net-SNMP disponibles

PaquetFournit
net-snmpLe démon de l'agent SNMP et la documentation. Ce paquet est requis pour exporter des données de performance.
net-snmp-libsLa bibliothèque netsnmp et les management information bases (MIB) groupése. Ce paquet est requis pour exporter des données de performance.
net-snmp-utilsLes clients SNMP tels que snmpget et snmpwalk. Ce paquet est requis pour effectuer des requêtes de données de performance d'un système sur SNMP.
net-snmp-perlL'utilitaire mib2c et le module Perl NetSNMP. Remarquez que ce paquet est fournit par le canal optionnel « Optional ». Veuillez consulter la Section 8.5.7, « Ajouter les référentiels « Optional » (Optionnel) et « Supplementary » (Supplémentaire) » pour obtenir davantage d'informations sur les canaux supplémentaires de Red Hat.
net-snmp-pythonLa bibliothèque cliente SNMP de Python. Remarquez que ce paquet est fourni par le canal « Optional ». Veuillez consulter la Section 8.5.7, « Ajouter les référentiels « Optional » (Optionnel) et « Supplementary » (Supplémentaire) » pour obtenir davantage d'informations sur les canaux supplémentaires Red Hat.
Pour installer ces paquets, utiliser la commande yum sous la forme suivante :
yum install package
Par exemple, pour installer le démon de l'agent SNMP et les clients SNMP utilisés dans le reste de cette section, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
~]# yum install net-snmp net-snmp-libs net-snmp-utils
Pour obtenir davantage d'informations sur la manière d'installer de nouveaux paquets sur Red Hat Enterprise Linux, veuillez consulter la Section 8.2.4, « Installation de paquets ».

18.7.2. Exécuter le démon Net-SNMP

Le paquet net-snmp contient snmpd, le démon de l'agent SNMP. Cette section fournit des informations sur la manière de lancer, arrêter, et redémarrer le service snmpd. Pour obtenir davantage d'informations sur la gestion des services systèmes dans Red Hat Enterprise Linux 7, veuillez consulter le Chapitre 9, Gérer les services avec systemd.

18.7.2.1. Lancer le service

Pour exécuter le service snmpd dans la session actuelle, veuillez saisir ce qui suit dans l'invite de shell en tant qu'utilisateur root :
systemctl start snmpd.service
Pour configurer le service afin qu'il soit automatiquement lancé lors du démarrage, veuillez utiliser la commande suivante :
systemctl enable snmpd.service

18.7.2.2. Arrêter le service

Pour arrêter le service en cours d'exécution snmpd, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl stop snmpd.service
Pour désactiver le lancement du service lors du démarrage, veuillez utiliser la commande suivante :
systemctl disable snmpd.service

18.7.2.3. Redémarrer le service

Pour redémarrer le service snmpd, saisissez ce qui suit dans l'invite du shell :
systemctl restart snmpd.service
Cette commande arrête le service et le lance à nouveau en une succession rapide. Pour uniquement recharger la configuration sans arrêter le service, veuillez exécuter la commande suivante à la place :
systemctl reload snmpd.service
Cela amène le service en cours d'exécution snmpd à recharger sa configuration.

18.7.3. Configurer Net-SNMP

Pour changer la configuration du démon de l'agent Net-SNMP, veuillez modifier le fichier de configuration /etc/snmp/snmpd.conf. Le fichier par défaut snmpd.conf inclus avec Red Hat Enterprise Linux 7 contient beaucoup de commentaires et peut servir de bon point de départ pour la configuration de l'agent.
Cette section traite de deux tâches courantes : la définition des informations système et la configuration de l'authentification. Pour obtenir davantage d'informations sur les directives de configuration disponibles, veuillez consulter la page man de snmpd.conf(5). En outre, il existe un utilitaire dans le paquet net-snmp nommé snmpconf, qui peut être utilisé de manière interactive pour générer une configuration d'agent valide.
Remarquez que le paquet net-snmp-utils doit être installé pour pouvoir utiliser l'utilitaire snmpwalk décrit dans cette section.

Note

Pour que tout changement apporté au fichier de configuration puisse entrer en vigueur, veuillez forcer le service snmpd à relire la configuration en exécutant la commande suivante en tant qu'utilisateur root :
systemctl reload snmpd.service

18.7.3.1. Définir les informations système

Net-SNMP fournit certaines informations système rudimentaires via l'arborescence system. Par exemple, la commande snmpwalk suivante montre l'arborescence system avec une configuration d'agent par défaut.
~]# snmpwalk -v2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (464) 0:00:04.64
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)[sortie tronquée]
Par défaut, l'objet sysName est défini sur le nom d'hôte. Les objets sysLocation et sysContact peuvent être configurés dans le fichier /etc/snmp/snmpd.conf en modifiant la valeur des directives syslocation et syscontact. Exemple :
syslocation Datacenter, Row 4, Rack 3
syscontact UNIX Admin <admin@example.com>
Après avoir apporté des changements au fichier de configuration, rechargez la configuration et testez-la en exécutant la commande snmpwalk à nouveau :
~]# systemctl reload snmp.service
~]# snmpwalk -v2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (35424) 0:05:54.24
SNMPv2-MIB::sysContact.0 = STRING: UNIX Admin <admin@example.com>
SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain
SNMPv2-MIB::sysLocation.0 = STRING: Datacenter, Row 4, Rack 3[sortie tronquée]

18.7.3.2. Configurer l'authentification

Le démon de l'agent Net-SNMP prend en charge les trois versions du protocole SNMP. Les deux première versions (1 et 2c) fournissent une simple authentification en utilisant une chaîne de communauté. Cette chaîne est un secret partagé entre l'agent et tout utilitaire client. Cependant, la chaîne est transmise en texte clair sur le réseau, et n'est donc pas considérée comme sécurisée. La version 3 du protocole SNMP prend en charge l'authentification d'utilisateur et le chiffrement de messages en utilisant tout un ensemble de protocoles. L'agent Net-SNMP prend également en charge la mise sous tunnel avec SSH, l'authentification TLS avec certificats X.509, et l'authentification Kerberos.
Configurer une communauté SNMP Version 2c
Pour configurer une communauté SNMP version 2c, veuillez utiliser la directive rocommunity ou rwcommunity dans le fichier de configuration /etc/snmp/snmpd.conf. Le format des directives est comme suit :
directive community [source [OID]]
… avec community correspondant à la chaîne de communauté à utiliser, source est une adresse IP ou un sous-réseau, et OID est l'arborescence SNMP à laquelle l'accès doit être fourni. Ainsi, la directive suivante fournit un accès en lecture seule à l'arborescence system à un client utilisant la chaîne de communité « redhat » sur la machine locale :
rocommunity redhat 127.0.0.1 .1.3.6.1.2.1.1
Pour tester la configuration, veuillez utiliser la commande snmpwalk avec les options -v et -c.
~]# snmpwalk -v2c -c redhat localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (101376) 0:16:53.76
SNMPv2-MIB::sysContact.0 = STRING: UNIX Admin <admin@example.com>
SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain
SNMPv2-MIB::sysLocation.0 = STRING: Datacenter, Row 4, Rack 3[sortie tronquée]
Configurer un utilisateur SNMP Version 3
Pour configurer un utilisateur SNMP version 3, veuillez utiliser la commande net-snmp-create-v3-user. Cette command ajoute des entrées aux fichiers /var/lib/net-snmp/snmpd.conf et /etc/snmp/snmpd.conf qui créent l'utilisateur et offrent accès à l'utilisateur. Remarque que la commande net-snmp-create-v3-user peut uniquement être exécutée lorsque l'agent n'est pas en cours d'exécution. L'exemple suivant crée l'utilisateur « admin » avec le mot de passe « redhatsnmp » :
~]# systemctl stop snmpd.service
~]# net-snmp-create-v3-user
Enter a SNMPv3 user name to create:
admin
Enter authentication pass-phrase:
redhatsnmp
Enter encryption pass-phrase:
  [press return to reuse the authentication pass-phrase]

adding the following line to /var/lib/net-snmp/snmpd.conf:
   createUser admin MD5 "redhatsnmp" DES
adding the following line to /etc/snmp/snmpd.conf:
   rwuser admin
~]# systemctl start snmpd.service
La directive rwuser (ou rouser lorsque l'option de ligne de commande -ro est fournie) ajoutée par net-snmp-create-v3-user à /etc/snmp/snmpd.conf possède un format similaire aux directives rwcommunity et rocommunity :
directive user [noauth|auth|priv] [OID]
… quand user est un nom d'utilisateur et OID est l'arborescence SNMP à laquelle l'accès doit être fournit . Par défaut, le démon de l'agent Net-SNMP autorise uniquement les requêtes authentifiées (l'option auth). L'option noauth vous permet d'autoriser des requêtes non authentifiées, et l'option priv applique l'utilisation du chiffrement. L'option authpriv spécifie que les requêtes doivent être authentifiées et que les réponses doivent être chiffrées.
Ainsi, la ligne suivante offre à l'utilisateur « admin » un accès en lecture et écriture à la totalité de l'arborescence :
rwuser admin authpriv .1
Pour tester la configuration, veuillez créer un répertoire .snmp/ dans le répertoire personnel de l'utilisateur, ainsi qu'un fichier de configuration nommé snmp.conf dans ce répertoire (~/.snmp/snmp.conf) avec les lignes suivantes :
defVersion 3
defSecurityLevel authPriv
defSecurityName admin
defPassphrase redhatsnmp
La commande snmpwalk utilisera ces paramètres d'authentification lorsque des requêtes sont effectuées sur l'agent :
~]$ snmpwalk -v3 localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64[sortie tronquée]

18.7.4. Récupérer des données de performance sur SNMP

L'agent Net-SNMP sur Red Hat Enterprise Linux fournit un large éventail d'informations sur les performances via le protocole SNMP. De plus, des requêtes peuvent être effectués sur l'agent pour obtenir une liste des paquets RPM installés sur le système, une liste des processus actuellement en cours d'exécution sur le système, ou la configuration réseau du système.
Cette section fournit un aperçu des OID liés aux réglages des performances disponibles sur SNMP. Elle suppose que le paquet net-snmp-utils soit installé et que l'utilisateur ait accès à l'arborescence SNMP comme décrit dans la Section 18.7.3.2, « Configurer l'authentification ».

18.7.4.1. Configuration du matériel

Le MIB des ressources d'hôte, « Host Resources MIB », inclus avec Net-SNMP présente des informations sur la configuration du matériel et des logiciels d'un hôte à un utilitaire client. Tableau 18.3, « OID disponibles » résume les différents OID disponibles sous ce MIB.

Tableau 18.3. OID disponibles

OIDDescription
HOST-RESOURCES-MIB::hrSystemContient des informations système générales telles que le temps d'activité, le nombre d'utilisateurs, et le nombre de processus en cours d'utilisation.
HOST-RESOURCES-MIB::hrStorageContient des données sur l'utilisation de la mémoire et des systèmes de fichiers.
HOST-RESOURCES-MIB::hrDevicesContient une liste des processeurs, périphériques réseau, et systèmes de fichiers.
HOST-RESOURCES-MIB::hrSWRunContient une liste de tous les processus en cours d'utilisation.
HOST-RESOURCES-MIB::hrSWRunPerfContient des statistiques sur la mémoire et le CPU sur la table de processus de HOST-RESOURCES-MIB::hrSWRun.
HOST-RESOURCES-MIB::hrSWInstalledContient une liste de la base de données RPM.
Un certain nombre de tables SNMP sont également disponibles dans le MIB des ressources de l'hôte, pouvant être utilisées pour récupérer un résumé des informations disponibles. L'exemple suivant afficher HOST-RESOURCES-MIB::hrFSTable :
~]$ snmptable -Cb localhost HOST-RESOURCES-MIB::hrFSTable
SNMP table: HOST-RESOURCES-MIB::hrFSTable

 Index MountPoint RemoteMountPoint                                Type
    Access Bootable StorageIndex LastFullBackupDate LastPartialBackupDate
     1        "/"               "" HOST-RESOURCES-TYPES::hrFSLinuxExt2
 readWrite     true           31      0-1-1,0:0:0.0         0-1-1,0:0:0.0
     5 "/dev/shm"               ""     HOST-RESOURCES-TYPES::hrFSOther
 readWrite    false           35      0-1-1,0:0:0.0         0-1-1,0:0:0.0
     6    "/boot"               "" HOST-RESOURCES-TYPES::hrFSLinuxExt2
 readWrite    false           36      0-1-1,0:0:0.0         0-1-1,0:0:0.0
Pour obtenir davantage d'informations sur HOST-RESOURCES-MIB, veuillez consulter le fichier /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt.

18.7.4.2. Informations mémoire et CPU

La plupart des données de performances sont disponibles sur le MIB SNMP UCS « UCD SNMP MIB ». L'OID systemStats fournit un certain nombre de compteurs autour de l'utilisation du processeur :
~]$ snmpwalk localhost UCD-SNMP-MIB::systemStats
UCD-SNMP-MIB::ssIndex.0 = INTEGER: 1
UCD-SNMP-MIB::ssErrorName.0 = STRING: systemStats
UCD-SNMP-MIB::ssSwapIn.0 = INTEGER: 0 kB
UCD-SNMP-MIB::ssSwapOut.0 = INTEGER: 0 kB
UCD-SNMP-MIB::ssIOSent.0 = INTEGER: 0 blocks/s
UCD-SNMP-MIB::ssIOReceive.0 = INTEGER: 0 blocks/s
UCD-SNMP-MIB::ssSysInterrupts.0 = INTEGER: 29 interrupts/s
UCD-SNMP-MIB::ssSysContext.0 = INTEGER: 18 switches/s
UCD-SNMP-MIB::ssCpuUser.0 = INTEGER: 0
UCD-SNMP-MIB::ssCpuSystem.0 = INTEGER: 0
UCD-SNMP-MIB::ssCpuIdle.0 = INTEGER: 99
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 2278
UCD-SNMP-MIB::ssCpuRawNice.0 = Counter32: 1395
UCD-SNMP-MIB::ssCpuRawSystem.0 = Counter32: 6826
UCD-SNMP-MIB::ssCpuRawIdle.0 = Counter32: 3383736
UCD-SNMP-MIB::ssCpuRawWait.0 = Counter32: 7629
UCD-SNMP-MIB::ssCpuRawKernel.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuRawInterrupt.0 = Counter32: 434
UCD-SNMP-MIB::ssIORawSent.0 = Counter32: 266770
UCD-SNMP-MIB::ssIORawReceived.0 = Counter32: 427302
UCD-SNMP-MIB::ssRawInterrupts.0 = Counter32: 743442
UCD-SNMP-MIB::ssRawContexts.0 = Counter32: 718557
UCD-SNMP-MIB::ssCpuRawSoftIRQ.0 = Counter32: 128
UCD-SNMP-MIB::ssRawSwapIn.0 = Counter32: 0
UCD-SNMP-MIB::ssRawSwapOut.0 = Counter32: 0
En particulier, les OID ssCpuRawUser, ssCpuRawSystem, ssCpuRawWait, et ssCpuRawIdle fournissent des compteurs qui sont utiles pour déterminer si un système passe la plupart de son temps de traitement dans l'espace du noyau, l'espace utilisateur, ou les E/S. ssRawSwapIn et ssRawSwapOut peuvent être utiles pour déterminer si un système souffre d'épuisement de mémoire.
Davantage d'informations mémoire sont disponibles sous l'OID UCD-SNMP-MIB::memory, qui fournit des données similaires à la commande free :
~]$ snmpwalk localhost UCD-SNMP-MIB::memory
UCD-SNMP-MIB::memIndex.0 = INTEGER: 0
UCD-SNMP-MIB::memErrorName.0 = STRING: swap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 1023992 kB
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 1023992 kB
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 1021588 kB
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 634260 kB
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 1658252 kB
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 30760 kB
UCD-SNMP-MIB::memCached.0 = INTEGER: 216200 kB
UCD-SNMP-MIB::memSwapError.0 = INTEGER: noError(0)
UCD-SNMP-MIB::memSwapErrorMsg.0 = STRING:
Les moyennes des charges sont également disponibles dans le MIB SNMP UCD « UCD SNMP MIB ». La table SNMP UCD-SNMP-MIB::laTable possède une liste des moyennes de charges de 1, 5, et 15 minutes :
~]$ snmptable localhost UCD-SNMP-MIB::laTable
SNMP table: UCD-SNMP-MIB::laTable

 laIndex laNames laLoad laConfig laLoadInt laLoadFloat laErrorFlag laErrMessage
       1  Load-1   0.00    12.00         0    0.000000     noError
       2  Load-5   0.00    12.00         0    0.000000     noError
       3 Load-15   0.00    12.00         0    0.000000     noError

18.7.4.3. Informations sur les systèmes de fichiers et les disques

Le MIB des ressources hôte « Host Resources MIB » fournit des informations sur la taille et l'utilisation du système de fichiers. Chaque système de fichiers (ainsi que chaque pool de mémoire) possède une entrée dans la table HOST-RESOURCES-MIB::hrStorageTable :
~]$ snmptable -Cb localhost HOST-RESOURCES-MIB::hrStorageTable
SNMP table: HOST-RESOURCES-MIB::hrStorageTable

 Index                                         Type           Descr
AllocationUnits    Size   Used AllocationFailures
     1           HOST-RESOURCES-TYPES::hrStorageRam Physical memory
1024 Bytes 1021588 388064                  ?
     3 HOST-RESOURCES-TYPES::hrStorageVirtualMemory  Virtual memory
1024 Bytes 2045580 388064                  ?
     6         HOST-RESOURCES-TYPES::hrStorageOther  Memory buffers
1024 Bytes 1021588  31048                  ?
     7         HOST-RESOURCES-TYPES::hrStorageOther   Cached memory
1024 Bytes  216604 216604                  ?
    10 HOST-RESOURCES-TYPES::hrStorageVirtualMemory      Swap space
1024 Bytes 1023992      0                  ?
    31     HOST-RESOURCES-TYPES::hrStorageFixedDisk               /
4096 Bytes 2277614 250391                  ?
    35     HOST-RESOURCES-TYPES::hrStorageFixedDisk        /dev/shm
4096 Bytes  127698      0                  ?
    36     HOST-RESOURCES-TYPES::hrStorageFixedDisk           /boot
1024 Bytes  198337  26694                  ?
Les OID sous HOST-RESOURCES-MIB::hrStorageSize et HOST-RESOURCES-MIB::hrStorageUsed peuvent être utilisés pour calculer la capacité restante de chaque système de fichiers monté.
Des données d'E/S sont disponibles sur UCD-SNMP-MIB::systemStats (ssIORawSent.0 et ssIORawRecieved.0) et sur UCD-DISKIO-MIB::diskIOTable. Ce dernier fournit des données plus granulaires. Sous cette table, se trouvent des OID pour diskIONReadX et diskIONWrittenX, qui fournissent des compteurs pour le nombre d'octets lus et écrits sur le périphérique bloc en question depuis le démarrage système :
~]$ snmptable -Cb localhost UCD-DISKIO-MIB::diskIOTable
SNMP table: UCD-DISKIO-MIB::diskIOTable

 Index Device     NRead  NWritten Reads Writes LA1 LA5 LA15    NReadX NWrittenX
...
    25    sda 216886272 139109376 16409   4894   ?   ?    ? 216886272 139109376
    26   sda1   2455552      5120   613      2   ?   ?    ?   2455552      5120
    27   sda2   1486848         0   332      0   ?   ?    ?   1486848         0
    28   sda3 212321280 139104256 15312   4871   ?   ?    ? 212321280 139104256

18.7.4.4. Informations réseau

Le MIB des interfaces, « Interfaces MIB », fournit des informations sur les périphériques réseau. IF-MIB::ifTable fournit une table SNMP avec une entrée pour chaque interface sur le système, la configuration de l'interface, et divers compteurs de paquets pour l'interface. L'exemple suivant affiche les premières colonnes d'ifTable sur un système avec deux interfaces réseau physiques :
~]$ snmptable -Cb localhost IF-MIB::ifTable
SNMP table: IF-MIB::ifTable

 Index Descr             Type   Mtu    Speed      PhysAddress AdminStatus
     1    lo softwareLoopback 16436 10000000                           up
     2  eth0   ethernetCsmacd  1500        0 52:54:0:c7:69:58          up
     3  eth1   ethernetCsmacd  1500        0 52:54:0:a7:a3:24        down
Le trafic réseau est disponibles sous les OID IF-MIB::ifOutOctets et IF-MIB::ifInOctets. Les requêtes SNMP suivantes récupéreront le trafic réseau pour chacune des interfaces sur ce système :
~]$ snmpwalk localhost IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
~]$ snmpwalk localhost IF-MIB::ifOutOctets
IF-MIB::ifOutOctets.1 = Counter32: 10060699
IF-MIB::ifOutOctets.2 = Counter32: 650
IF-MIB::ifOutOctets.3 = Counter32: 0
~]$ snmpwalk localhost IF-MIB::ifInOctets
IF-MIB::ifInOctets.1 = Counter32: 10060699
IF-MIB::ifInOctets.2 = Counter32: 78650
IF-MIB::ifInOctets.3 = Counter32: 0

18.7.5. Étendre Net-SNMP

L'agent Net-SNMP peut être étendu pour fournir des indicateurs d'applications en plus des indicateurs de systèmes bruts. Cela permet la planification des capacités, ainsi que la résolution des problèmes de performance. Ainsi, il peut être utile de savoir qu'un système de courrier électronique possède une charge moyenne de 5 minutes de 15 lorsque testé, mais il est encore plus utile de savoir que le système de courrier électronique possède une charge moyenne de 15 lors du traitement de 80 000 messages par seconde. Lorsque les indicateurs d'applications sont disponibles via la même interface que les indicateurs du système, cela permet également la visualisation de l'impact des différent scénarios de charge sur les performances système (par exemple, la charge moyenne augmentera de manière linéaire, chaque fois qu'il y a 10 000 messages supplémentaires, jusqu'à ce que l'on atteigne 100,000).
Un certain nombre d'applications incluses dans Red Hat Enterprise Linux étendent l'agent Net-SNMP pour fournir des indicateurs d'applications sur SNMP. Il existe également plusieurs manières d'étendre l'agent pour des applications personnalisées. Cette section décrit l'extension de l'agent avec des scripts shell et des greffons Perl à partir du canal « Optional ». Elle suppose que les paquets net-snmp-utils et net-snmp-perl soient installés et que l'utilisateur ait accès à l'arborescence SNMP, comme décrit dans la Section 18.7.3.2, « Configurer l'authentification ».

18.7.5.1. Étendre Net-SNMP avec des scripts Shell

L'agent Net-SNMP fournit une extension MIB (NET-SNMP-EXTEND-MIB) qui peut être utilisée pour effectuer des requêtes de scripts shell arbitraires. Pour indiquer quel script shell exécuter, veuillez utiliser la directive extend dans le fichier /etc/snmp/snmpd.conf. Une fois défini, l'agent fournira le code de sortie et toute sortie de la commande sur SNMP. L'exemple ci-dessous fait une démonstration de ce mécanisme avec un script qui détermine le nombre de processus httpd dans la table des processus.

Note

L'agent Net-SNMP fournit également un mécasnisme intégré de vérification de la table des processus via la directive proc. Veuillez consulter la page man de snmpd.conf(5) pour obtenir davantage d'informations.
Le code de sortie du script shell suivant est le nombre de processus httpd exécutés sur le système à un moment donné :
#!/bin/sh

NUMPIDS=`pgrep httpd | wc -l`

exit $NUMPIDS
Pour que ce script soit disponible sur SNMP, copiez le script sur un emplacement sur le chemin système, définissez le bit exécutable, et ajoutez une directive extend au fichier /etc/snmp/snmpd.conf. Le format de la directive extend est comme suit :
extend name prog args
… où name est une chaîne d'identification pour l'extension, prog est le programme à exécuter, et args sont les arguments à donner au programme. Par exemple, si le script shell ci-dessus est copié sur /usr/local/bin/check_apache.sh, la directive suivante ajoutera le script à l'arborescence SNMP :
extend httpd_pids /bin/sh /usr/local/bin/check_apache.sh
Des requêtes peuvent ensuite être effectuées sur le script sur NET-SNMP-EXTEND-MIB::nsExtendObjects :
~]$ snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendCommand."httpd_pids" = STRING: /bin/sh
NET-SNMP-EXTEND-MIB::nsExtendArgs."httpd_pids" = STRING: /usr/local/bin/check_apache.sh
NET-SNMP-EXTEND-MIB::nsExtendInput."httpd_pids" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."httpd_pids" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendExecType."httpd_pids" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."httpd_pids" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendStorage."httpd_pids" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStatus."httpd_pids" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."httpd_pids" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."httpd_pids" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."httpd_pids" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."httpd_pids" = INTEGER: 8
NET-SNMP-EXTEND-MIB::nsExtendOutLine."httpd_pids".1 = STRING:
Remarquez que le code de sortie (« 8 » dans cet exemple) fourni est de type INTEGER (entier) et toute sortie fournie es de type STRING (chaîne). Pour exposer de multiples indicateurs en tant qu'entiers, veuillez fournir différents arguments au script en utilisant la directive extend. Par exemple, le script shell suivant peut être utilisé pour déterminer le nombre de processus correspondants à une chaîne arbitraire, et fera également sortir une chaîne de texte donnant le nombre de processus :
#!/bin/sh

PATTERN=$1
NUMPIDS=`pgrep $PATTERN | wc -l`

echo "There are $NUMPIDS $PATTERN processes."
exit $NUMPIDS
Les directives suivantes /etc/snmp/snmpd.conf donneront le nombre de PID httpd ainsi que le nombre de PID snmpd lorsque le script ci-dessus est copié sur /usr/local/bin/check_proc.sh :
extend httpd_pids /bin/sh /usr/local/bin/check_proc.sh httpd
extend snmpd_pids /bin/sh /usr/local/bin/check_proc.sh snmpd
L'exemple suivant affiche la sortie snmpwalk de l'OID nsExtendObjects :
~]$ snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 2
NET-SNMP-EXTEND-MIB::nsExtendCommand."httpd_pids" = STRING: /bin/sh
NET-SNMP-EXTEND-MIB::nsExtendCommand."snmpd_pids" = STRING: /bin/sh
NET-SNMP-EXTEND-MIB::nsExtendArgs."httpd_pids" = STRING: /usr/local/bin/check_proc.sh httpd
NET-SNMP-EXTEND-MIB::nsExtendArgs."snmpd_pids" = STRING: /usr/local/bin/check_proc.sh snmpd
NET-SNMP-EXTEND-MIB::nsExtendInput."httpd_pids" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendInput."snmpd_pids" = STRING:
...
NET-SNMP-EXTEND-MIB::nsExtendResult."httpd_pids" = INTEGER: 8
NET-SNMP-EXTEND-MIB::nsExtendResult."snmpd_pids" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendOutLine."httpd_pids".1 = STRING: There are 8 httpd processes.
NET-SNMP-EXTEND-MIB::nsExtendOutLine."snmpd_pids".1 = STRING: There are 1 snmpd processes.

Avertissement

L'éventail des codes de sortie qui sont des entiers va de 0 à 255. Pour les valeurs qui dépasseront probablement 256, veuillez utiliser la sortie standard du script (qui sera saisie en tant que chaîne) ou une méthode différente d'étendre l'agent.
Ce dernier exemple montre une requête de mémoire libre du système et le nombre de processus httpd. Cette requête pourrait être utilisée pendant un test de performance pour déterminer l'impact du nombre de processus sur la pression mémoire :
~]$ snmpget localhost \
    'NET-SNMP-EXTEND-MIB::nsExtendResult."httpd_pids"' \
    UCD-SNMP-MIB::memAvailReal.0
NET-SNMP-EXTEND-MIB::nsExtendResult."httpd_pids" = INTEGER: 8
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 799664 kB

18.7.5.2. Extension de Net-SNMP avec Perl

L'exécution de scripts shell en utilisant la directive extend est une méthode assez limitée pour exposer des indicateurs d'application personnalisée sur SNMP. L'agent Net-SNMP fournit également une interface Perl intégrée pour exposer des objets personnalisés. Le paquet net-snmp-perl dans le canal « Optional » fournit le module Perl NetSNMP::agent, qui est utilisé pour écrire des greffons Perl intégrés dans Red Hat Enterprise Linux.

Note

Avant de vous abonner aux canaux « Optional » et « Supplementary », veuillez consulter les Détails de l'étendue de la couverture. Si vous décidez d'installer des paquets à partir de ces canaux, veuillez suivre les étapes documentées dans l'article nommé Comment accéder aux canaux « Optional » et « Supplementary » et aux paquets -devel en utilisant Red Hat Subscription Manager (RHSM) ? sur le Portail Client Red Hat.
Le module Perl NetSNMP::agent fournit un objet agent utilisé pour gérer les requêtes d'une partie de l'arborescence OID de l'agent. Le constructeur de l'objet agent offre des options pour exécuter l'agent en tant que sous-agent de snmpd ou en tant qu'agent autonome. Aucun argument n'est nécessaire pour créer un agent intégré :
use NetSNMP::agent (':all');

my $agent = new NetSNMP::agent();
L'objet agent offre une méthode register utilisée pour enregistrer une fonction de rappel avec un OID particulier. La fonction register prend un nom, un OID, et un pointeur sur la fonction de rappel. L'exemple suivant enregistrera une fonction de rappel nommée hello_handler avec l'agent SNM, qui gérera les requêtes sous l'OID .1.3.6.1.4.1.8072.9999.9999 :
$agent->register("hello_world", ".1.3.6.1.4.1.8072.9999.9999",
                 \&hello_handler);

Note

En général, l'OID .1.3.6.1.4.1.8072.9999.9999 (NET-SNMP-MIB::netSnmpPlaypen) est utilisé pour effectuer des démonstrations uniquement. Si votre organisation ne possède pas déjà un OID root, vous pouvez en obtenir un en contactant une autorité d'enregistrement de nom ISO (appelé ANSI aux États-Unis).
La fonction de gestionnaire sera appelée avec quatre paramètres, HANDLER, REGISTRATION_INFO, REQUEST_INFO, et REQUESTS. Le paramètre REQUESTS contient une liste de requêtes dans l'appel actuel et devrait être itéré et rempli avec des données. Les objets request dans la liste possèdent des méthodes get et set qui permettent de manipuler l' OID et la valeur value de la requête. Par exemple, l'appel suivant définira la valeur d'un objet de requête sur la chaîne « hello world » :
$request->setValue(ASN_OCTET_STR, "hello world");
La fonction de gestionnaire devrait répondre à deux types de requêtes SNMP : la requête GET et la requête GETNEXT. Le type de requête est déterminé en appelant la méthode getMode sur l'objet request_info passé en tant que troisième paramètre à la fonction de gestionnaire. Si la requête est une requête GET, l'appelant s'attendra à ce que le gestionnaire définisse la valeur value de l'objet request, selon l'OID de la requête. Si la requête est une requête GETNEXT request, l'appelant devra également s'attendre à ce que le gestionnaire définisse l'OID de la requête sur le prochain OID disponible dans l'arborescence. Ceci est illustré dans l'exemple de code suivant :
my $request;
my $string_value = "hello world";
my $integer_value = "8675309";

for($request = $requests; $request; $request = $request->next()) {
  my $oid = $request->getOID();
  if ($request_info->getMode() == MODE_GET) {
    if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setValue(ASN_OCTET_STR, $string_value);
    }
    elsif ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.1")) {
      $request->setValue(ASN_INTEGER, $integer_value);
    }
  } elsif ($request_info->getMode() == MODE_GETNEXT) {
    if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.1");
      $request->setValue(ASN_INTEGER, $integer_value);
    }
    elsif ($oid < new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.0");
      $request->setValue(ASN_OCTET_STR, $string_value);
    }
  }
}
Lorsque getMode retourne MODE_GET, le gestionnaire analyse la valeur de l'appel getOID sur l'objet request. La valeur value de request est définie sur string_value si l'OID se termine par « .1.0 », ou sur integer_value si l'OID se termine par « .1.1 ». Si getMode retourne MODE_GETNEXT, le gestionnaire détermine si l'OID de la requête est « .1.0 », puis définit l'OID et la valeur pour « .1.1 ». Si la requête est plus élevée que « .1.0 » sur l'arborescence, l'OID et la valeur de « .1.0 » est définie. Ceci retourne la valeur « next » dans l'arborescence afin qu'un programme comme snmpwalk puisse traverser l'arborescence sans connaître la structure au préalable.
Le type de variable est défini en utilisant des constantes de NetSNMP::ASN. Veuillez consulter le perldoc de NetSNMP::ASN pour une liste complète des constantes disponibles.
La liste du code entier de cet exemple de greffon Perl est comme suit :
#!/usr/bin/perl

use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);

sub hello_handler {
  my ($handler, $registration_info, $request_info, $requests) = @_;
  my $request;
  my $string_value = "hello world";
  my $integer_value = "8675309";

  for($request = $requests; $request; $request = $request->next()) {
    my $oid = $request->getOID();
    if ($request_info->getMode() == MODE_GET) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
      elsif ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.1")) {
        $request->setValue(ASN_INTEGER, $integer_value);
      }
    } elsif ($request_info->getMode() == MODE_GETNEXT) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.1");
        $request->setValue(ASN_INTEGER, $integer_value);
      }
      elsif ($oid < new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.0");
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
    }
  }
}

my $agent = new NetSNMP::agent();
$agent->register("hello_world", ".1.3.6.1.4.1.8072.9999.9999",
                 \&hello_handler);
Pour tester le greffon, copiez le programme ci-dessus sur /usr/share/snmp/hello_world.pl et ajoutez la ligne suivante au fichier de configuration /etc/snmp/snmpd.conf :
perl do "/usr/share/snmp/hello_world.pl"
Le démon de l'agent SNMP devra être redémarré pour charger le nouveau greffon Perl. Une fois redémarré, snmpwalk devrait retourner les nouvelles données :
~]$ snmpwalk localhost NET-SNMP-MIB::netSnmpPlaypen
NET-SNMP-MIB::netSnmpPlaypen.1.0 = STRING: "hello world"
NET-SNMP-MIB::netSnmpPlaypen.1.1 = INTEGER: 8675309
snmpget doit également être utilisé pour exercer l'autre mode du gestionnaire :
~]$ snmpget localhost \
    NET-SNMP-MIB::netSnmpPlaypen.1.0 \
    NET-SNMP-MIB::netSnmpPlaypen.1.1
NET-SNMP-MIB::netSnmpPlaypen.1.0 = STRING: "hello world"
NET-SNMP-MIB::netSnmpPlaypen.1.1 = INTEGER: 8675309