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.
Paquet | Fournit |
---|---|
net-snmp | Le démon de l'agent SNMP et la documentation. Ce paquet est requis pour exporter des données de performance. |
net-snmp-libs | La bibliothèque netsnmp et les management information bases (MIB) groupése. Ce paquet est requis pour exporter des données de performance. |
net-snmp-utils | Les 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-perl | L'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-python | La 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.
OID | Description |
---|---|
HOST-RESOURCES-MIB::hrSystem | Contient 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::hrStorage | Contient des données sur l'utilisation de la mémoire et des systèmes de fichiers. |
HOST-RESOURCES-MIB::hrDevices | Contient une liste des processeurs, périphériques réseau, et systèmes de fichiers. |
HOST-RESOURCES-MIB::hrSWRun | Contient une liste de tous les processus en cours d'utilisation. |
HOST-RESOURCES-MIB::hrSWRunPerf | Contient des statistiques sur la mémoire et le CPU sur la table de processus de HOST-RESOURCES-MIB::hrSWRun. |
HOST-RESOURCES-MIB::hrSWInstalled | Contient 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