NSClient++ est un service pour toutes versions de Windows (NT, 2000, 2003, XP et Vista) qui combine les fonctionnalités d’un agent de supervision dédié à l’environnement Windows ainsi que les fonctions de transport NRPE et NSCA pour cet environnement. Il est disponible en version 32 et 64 bits. Du fait de ces triples fonctions, le fichier de configuration de NSClient++ est assez long mais également assez simple. Il est aujourd’hui considéré comme l’agent de supervision standard Nagios pour plateformes Windows.
L’installation de NSClient++ ne pose pas de problème grâce au format d’installation .msi fourni. Il suffit de valider par le bouton next chacun des écrans présentés. Le logiciel est installé par défaut dans le répertoire C:\Program Files\NSClient++. Il contient le fichier exécutable de service nsclient++, le répertoire modules contenant les extensions de NSClient++ et le fichier de configuration NSC.ini. Une entrée dans le menu Démarrer est également créée, permettant de stopper et démarrer le service. Pour voir les compteurs disponibles sur l’hôte supervisé, il est possible d’utiliser la commande suivante dans une fenêtre DOS.
NSClient++ CheckSystem listpdh
Il faut impérativement modifier le fichier de configuration fourni pour que NSClient++ puisse fonctionner. Le fichier est fourni entièrement commenté. Il est constitué d’une section générale et de sections spécifiques à chaque mode de fonctionnement de NSClient++.
[modules] FileLogger.dll CheckSystem.dll CheckDisk.dll NSClientListener.dll NRPEListener.dll SysTray.dll CheckEventLog.dll CheckHelpers.dll CheckWMI.dll NSCAAgent.dll LUAScript.dll CheckExternalScripts.dll NRPEClient.dll
Ce premier bloc de configuration permet d’activer et de désactiver les modules/extensions de NSClient++. Il faut bien sûr en activer au minimum quelques uns pour pouvoir interroger la machine.
[Settings] obfuscated_password=Jw0KAUUdXlAAUwASDAAB password=secret-password allowed_hosts=127.0.0.1/32,192.168.44.0/24,10.1.2.25 use_file=1 [log] debug=1 file=NSC.log date_mask=%Y-%m-%d %H:%M:%S
Ces deux nouveaux blocs de configuration contiennent les directives de fonctionnement général de NSClient++. Celles-ci sont faciles à comprendre. Deux directives pour un mot de passe qui devra être fourni à chaque interrogation distante de la machine, l’une en clair et l’autre masquée.
Le premier mode de fonctionnement de NSClient++ est un mode compatibilité destiné à honorer les développements faits sur cette plateforme dans le temps. Il existait, à l’époque où Nagios s’appellait encore NetSaint, un agent dédié Window nsclient interrogeable via le plugin standard check_nt. Ce mode possède son bloc de configuration distinct dans le fichier de configuration.
[NSClient] allowed_hosts= port=12489 bind_to_address= socket_timeout=30
À ce stade, le fichier de configuration est suffisamment renseigné pour fonctionner en mode nsclient. Depuis le serveur Nagios, il faut utiliser le plugin standard check_nt pour interroger le démon distant NSCLient++ en mode nsclient. Ce plugin possède de nombreuses options.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v CLIENTVERSION NSClient++ 0.3.2.9 2008-05-17
Ce même appel qui vérifie en plus que la version installée correspond bien à celle souhaitée.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v CLIENTVERSION -l "NSClient++ 0.3.2.9 2008-05-17" NSClient++ 0.3.2.9 2008-05-17
La logique d’utilisation est toujours la même avec l’utilisation du paramètre -l qui permet de préciser les valeurs à interroger. Voici quelques exemples permettant de contrôler les aspects système habituels d’une machine Windows.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v USEDDISKSPACE -l C -w 10 -c 5 C:\ - total: 9,99 Gb - used: 1,81 Gb (18%) - free 8,17 Gb (82%) | ’C:\ Used Space’=1,81Gb;0,00;0,00;0.00;9,99
usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v MEMUSE -w 10 -c 5 Memory usage: total:922,18 Mb - used: 100,87 Mb (11%) - free: 821,31 Mb (89%) | ’Memory usage’=100,87Mb;92,22;46,11;0.00;922,18
/usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v UPTIME System Uptime - 0 day(s) 1 hour(s) 16 minute(s)
Avec une interrogation qui permet un mode de calcul assez proche de celui observé sur machine Linux/Unix, soit une moyenne sur la dernière minute, les 5 et les 15 dernières minutes. Les seuils d’avertissement (90) et critique (95) sont précisés pour chacune des valeurs interrogées.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.10.100 -p 12489 -s giosna -v CPULOAD -l 1,90,95,5,90,95,15,90,95 CPU Load 0% (1 min average) 0% (5 min average) 0% (15 min average) | ’1 min avg Load’=0%;90;95;0;100 ’5 min avg Load’=0%;90;95;0;100 ’15 min avg Load’=0%;90;95;0;100
Le nom des services interrogés apparaît dans le message retour parce que l’option -d SHOWALL est précisée.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.44.200 -p 12489 -s giosna -v SERVICESTATE -d SHOWALL -l W32Time,"Services IPSec",NSClientpp W32Time: Started - Services IPSec: Started - NSClientpp: Started
Le même contrôle sans l’option -d SHOWALL donne :
/usr/local/nagios/libexec$ ./check_nt -H 192.168.44.200 -p 12489 -s giosna -v SERVICESTATE -l W32Time,"Services IPSec",NSClientpp OK: All services are running.
Pour contrôler des processus, la syntaxe est la même que SERVICESTATE vu précédemment y compris pour l’utilisation de -d SHOWALL. Le plugin ne permet pas de connaître le nombre d’occurrence du même processus. Il contrôle qu’au moins un est présent en mémoire.
/usr/local/nagios/libexec$ ./check_nt -H 192.168.44.200 -p 12489 -s giosna -v PROCSTATE -d SHOWALL -l svchost.exe,nsclient++.exe svchost.exe: Running - nsclient++.exe: Running
Pour transformer ces appels en commandes et services Nagios, il est soit possible de définir une commande Nagios générique au check_nt, soit de spécialiser la commande en fonction du contrôle qui est à effectuer pour avoir moins de paramètres à préciser dans le service correspondant.
define command{ command_name check_nt command_line $USER1$/check_nt -H $HOSTADDRESS$ -s giosna -p 12489 -v $ARG1$ $ARG2$ }
Cette commande est générique puisqu’elle permet d’appeler tout type de contrôle check_nt avec l’inconvénient de devoir préciser l’argument -l et -d SHOWALL au niveau du service comme ceci.
define service{ use generic-service host_name winserver service_description CPU Load check_command check_nt!CPULOAD!-l 1,90,95,5,90,95,15,90,95 }
En spécialisant la commande comme ceci,
define command{ command_name check_nt_load command_line $USER1$/check_nt -H $HOSTADDRESS$ -s giosna -p 12489 -v CPULOAD -l 1,$ARG1$,5,$ARG1$,15,$ARG1$ }
Alors la définition de service devient plus évidente.
define service{ use generic-service host_name winserver service_description CPU Load check_command check_nt_load!90,95 }
À chacun de voir suivant ses besoins et ses goûts le mode de configuration pour Nagios le plus approprié, mais la spécialisation des commandes permet vraiment de pouvoir avoir des services plus lisibles.
Après le mode de compatibilité que nous venons de voir, nous allons voir comment NSClient++ peut jouer le rôle d’un agent NRPE; à savoir un moyen de transport pour des contrôle effectués localement. Par rapport au mode de fonctionnement précédent, ce mode a l’avantage de pouvoir utiliser tous scripts Visual Basic, Perl ou DOS présents sur la machine et de ne pas se cantonner aux interrogations prévues par un agent spécialisé. Ce mode permet en plus d’encrypter les données pendant le transport, ce qui n’est pas le cas du premier mode vu. La particularité du mode NRPE de NSClient++ par rapport au démon équivalent Linux/Unix, c’est qu’il n’y a pas obligatoirement besoin de scripts externes puisqu’il est possible par ce moyen d’interroger les différents modules de NSClient++. Cette double possibilité se retrouve au niveau des blocs de configuration de NRPE pour NSClient++. La section NRPE contient les directives habituelles de réglages de démon comme la liste des hôtes autorisés à se connecter ou la possibilité de soumettre des arguments aux commandes. Ces directives sont les mêmes que celles du démon sur plateforme Linux/Unix, nous n’y revenons donc pas.
[NRPE] port=5666 command_timeout=60 allow_arguments=0 allow_nasty_meta_chars=0 use_ssl=1 bind_to_address= allowed_hosts= socket_timeout=30
Plus intéressante est la section Check System. Elle permet de fixer la taille du tampon utilisé pour le contrôle de la CPU et la fréquence de celui-ci avec les directives CPUBufferSize et CheckResolution. Il est conseillé d’utiliser un tampon bien dimensionné par rapport aux valeurs souhaitées. Ainsi, pour nos exemples, nous avons utilisé les compteurs 1,5 et 15 minutes. Une valeur de 20m est donc largement suffisante. La résolution est exprimée en dixième de sonde, une valeur de 10 prélève donc une valeur toutes les secondes. Les cinq lignes suivantes servent à régler le comportement du contrôle de service quand l’option ShowAll est précisée. C’est le cas de la commande alias_service qui est décrite dans la section External Alias du fichier de configuration.
[Check System] CPUBufferSize=20m CheckResolution=10 check_all_services[SERVICE_BOOT_START]=ignored check_all_services[SERVICE_SYSTEM_START]=ignored check_all_services[SERVICE_AUTO_START]=started check_all_services[SERVICE_DEMAND_START]=ignored check_all_services[SERVICE_DISABLED]=stopped
Le bloc External Script règle le comportement de NSClient++ quand il s’agit d’exécuter des scripts extérieurs à celui-ci.Il faut que le module CheckExternalScripts soit activé en début de fichier de configuration pour que ce bloc et le bloc External Alias soient fonctionnels. Les options sont les mêmes que le bloc NRPE.
[External Script] command_timeout=60 allow_arguments=0 allow_nasty_meta_chars=0 script_dir=c:\my\script\dir Le bloc External Scripts permet de spécifier le couple nom de commande NRPE et script à exécuter. [External Scripts] check_es_ok=scripts\ok.bat check_vbs_sample=cscript.exe //T:30 //NoLogo scripts\check_vb.vbs
Le bloc External Alias permet de définir des commandes accessibles via les modules internes de NSClient++ sous forme nom de commande NRPE et injection Nclient++.
[External Alias] alias_cpu=checkCPU warn=90 crit=95 time=1m time=5m time=15m alias_disk=CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED alias_service=checkServiceState CheckAll alias_mem=checkMem MaxWarn=80% MaxCrit=90% ShowAll type=physical
Le bloc includes permet comme son nom l’indique d’inclure des fichiers de configuration secondaires à celui-ci. Ces directives sont intéressantes quand il existe beaucoup de définitions de commandes NRPE. Elles sont alors déportées dans l’un de ces fichiers de configuration secondaires afin d’alléger la lecture du fichier principal.
[includes] myotherfile.ini real.ini
Le bloc NRPE Handlers est une reprise des blocs External Scripts et External Alias mais au format traditionnel NRPE. L’écriture peut être faite dans le format tel que connu sur Linux/Unix ou sous forme simplifiée propre à NSClient++. Les deux premières définitions sont ainsi identiques.
[NRPE Handlers] command[check_cpu]=inject checkCPU warn=90 crit=95 time=1m time=5m time=15m check_cpu=inject checkCPU warn=90 crit=95 time=1m time=5m time=15m check_disk=inject CheckDriveSize MinWarn=10% MinCrit=5% CheckAll FilterType=FIXED check_service=inject checkServiceState CheckAll check_mem=inject checkMem MaxWarn=80% MaxCrit=90% ShowAll type=physical check_ok=scripts\ok.bat check_vbs=cscript.exe //T:30 //NoLogo scripts\check_vb.vbs
Il est évident en voyant ce foisonnement de possibilités que certaines d’entre elles se recoupent. Cela est dû à la nature particulière de NSClient++ qui essaie à la fois de reprendre les protocoles « standards » de Nagios comme NRPE tout en développant de nouvelles directions propres aux systèmes Windows. De ce fait, la section NRPE Handlers reprend les mêmes contrôles que ceux exprimés dans les sections External Scripts et External Alias. Il est souvent judicieux de choisir parmi ces méthodes plutôt que de toutes les utiliser pour clarifier l’organisation des commandes de contrôle. Nous allons maintenant reprendre les principaux contrôles vus avec le mode nsclient mais cette fois-ci en mode NRPE. Les définitions à déclarer dans le fichier de configuration de NSClient++ sont données plus haut dans les blocs correspondant de l’explication du fichier de configuration.
/usr/local/nagios/libexec$ ./check_nrpe -H 192.168.10.100 -c alias_cpu OK CPU Load ok.|’1m’=3;90;95; ’5m’=0;90;95; ’15m’=0;90;95;
/usr/local/nagios/libexec$ ./check_nrpe -H 192.168.44.200 -c alias_disk OK: All drives within bounds.|’C:\’=82%;10;5;
/usr/local/nagios/libexec$ ./check_nrpe -H 192.168.44.200 -c alias_mem OK: physical memory: 141M|’physical memory’=36%;80;90;
/usr/local/nagios/libexec$ ./check_nrpe -H 192.168.44.200 -c alias_service OK: All services are running.
Côté serveur Nagios, la configuration de la commande Nagios étant déjà faite, il ne reste qu’à créer des services sur le modèle d’un service check_nrpe.
Le troisième mode à voir avec NSClient++ est le dernier introduit dans le logiciel. Il permet d’interroger localement la machine et de soumettre ses résultats à intervalles réguliers à Nagios via le protocole NSCA. Il en implémente la partie send_nsca. C’est donc tout naturellement que le fichier de configuration de NSClient++ contient un bloc spécifique à ce mode de fonctionnement. Le bloc NSCA Agent fixe le comportement de NSClient++ en mode NSCA. La directive de configuration avec une valeur à 300 signifie que les résultats sont envoyés toutes les 300 secondes, soit 5 minutes au serveur Nagios. La directive hostname permet de préciser un nom de machine plutôt que celui récupéré par la variable d’environnement Windows %COMPUTERNAME%. Les autres directives ont déjà été vues lors de la présentation de NSCA et send_nsca.
[NSCA Agent] interval=300 encryption_method=14 password= bind_to_address= hostname= nsca_host=192.168.0.1 nsca_port=5667
Le deuxième bloc de configuration concerne les déclarations de contrôle à faire dans ce mode. À chaque fois, il faut préciser le nom du service qui est à impacter dans Nagios et la commande NSClient++ à exécuter pour le contrôle.
[NSCA Commands] my_cpu_check=checkCPU warn=80 crit=90 time=20m time=10s time=4 my_mem_check=checkMem MaxWarn=80% MaxCrit=90% ShowAll type=page my_svc_check=checkServiceState CheckAll exclude=wampmysqld exclude=MpfService host_check=check_ok
Le principal intérêt de ce mode est bien évidemment la réduction de la bande passante réseau consommée qu’il occasionne. Si les contrôles fournis en standard par NSClient++ ne suffisent plus, il est possible d’écrire ses propres contrôles soit par des commandes appropriées pour dialoguer avec les modules de NSClient++ soit d’écrire ses propres scripts dans un langage supporté par la plateforme. Microsoft fournit gratuitement un outil précieux pour la réalisation de ces objectifs avec Scriptomatic (http://www.microsoft.com/technet/scriptcenter/tools/scripto2.mspx), qui permet de générer automatiquement des scripts d’interrogation WMI. WMI fournit normalement tous les compteurs possibles et imaginables pour la supervision, c’est donc un mode de collecte à privilégier.