Nagios: Superviser la santé Hyper-V 2012 – BPA & VM

Ce plugin Nagios vérifie la santé d’un serveur Hyper-V via un script PowerShell + NRPE (nsclient++):

  • Exécute et récupère le résultat du scan BPA (Best Practice Analyzer)
  • Vérifie que toutes les VM sont en cours d’exécution
  • Vérifie qu’aucune VM n’a un état de fonctionnement autre que normal

Les états avertissements et critiques sont déclenchés par la somme des:

  • Quantité d’alertes BPA
  • Nombre de VM dans un état autre que sain

Certaines VM (modèles…) peuvent être ignorées via un argument

Un nouveau scan BPA est lancé à chaque exécution, mais le résultat n’est récupéré que la fois suivante (async) (prend trop de temps).

Les données de performances suivantes sont fournies:

  • # VM arrêtées,
  • # VM avec problème de santé,
  • # Erreurs BPA
  • # Avertissements BPA

Configuration testée

Linux:

  • Centos 6.4 x64
  • Nagios 3.4.4
  • check_nrpe 2.13
  • Centreon 2.4.2

Windows:

  • Windows Server 2012 (nécessaire pour avoir le module PowerShell Hyper-V)
  • nsclient++ 0.4.1 x64

Arguments du script

  • excludeVM (séparées par des virgules)
  • maxWarn (Avertissement si supérieur) (1 par défaut)
  • maxError (Critique si supérieur) (5 par défaut)

maxWarn et maxCrit doivent être des entiers

Exemples d’utilisation

Exemple en exécution directe PowerShell:

PS C:Program FilesNSClient++scripts>. .lotp_check_hyper-v.ps1
WARNING: 'VM Not Running:'2 'VM issues:'0 BPA Error:1 BPA Warning:12|VM_Not_Running=2 VM_issues=0 BPA_Error=1 BPA_Warning=12
PS C:Program FilesNSClient++scripts>

Exécution NRPE:

[root~]# /usr/lib64/nagios/plugins/check_nrpe -H myMonitoredServer -n -c check_hyper-v
WARNING: 'VM Not Running:'2 'VM issues:'0 BPA Error:1 BPA Warning:12|VM_Not_Running=2 VM_issues=0 BPA_Error=1 BPA_Warning=12
[root~]#

Installation:

Sur les Windows:

  • Activer l’exécution de scripts PowerShell non signés : Set-ExecutionPolicy RemoteSigned
  • copier le script dans C:Program FilesNSClient++scripts
  • Ajouter dans le fichier nsclient.ini:
    • [/settings/external scripts/wrapped scripts]
      check_hyper-v=lotp_check_hyper-v.ps1 -excludeVM $ARG1$ -maxWarn $ARG2$ -maxError $ARG3$

Configuration:

Par exemple, sur Centreon, en ajoutant la commande:

$USER1$/check_nrpe -H $HOSTADDRESS$ -n -t 60 -c check_hyper-v -a $ARG1$ $ARG2$ $ARG3$

Téléchargement

lotp_check_hyper-v.ps1

Code source en direct:

 

# ====================================================================
# Ping a list of targets through NRPE
# Author: Mathieu Chateau - LOTP
# mail: mathieu.chateau@lotp.fr
# version 0.1
# ====================================================================

#
# Require Set-ExecutionPolicy RemoteSigned.. or sign this script with your PKI 
#

# ============================================================
#
#  Do not change anything behind that line!
#
param 
(
	[string]$targets,
	[int]$maxWarn = 1,
	[int]$maxError = 5
)

$output=""
$exitcode=2
$countOK=0
$countKO=0
$targetsArray=@()
$targetsArray=$targets -split(' ')
Remove-Job -Name * -Confirm:$false -Force
foreach($t in $targetsArray)
{
	Start-Job -Name $t -ArgumentList $t -ScriptBlock {param($t);if(Test-Connection -ComputerName $t  -Count 2 -Quiet -ErrorAction SilentlyContinue){return $true}else{return $false}} |Out-Null
}
while(Get-Job -State Running)
{
	Start-Sleep -Milliseconds 500
}
foreach ($job in Get-Job)
{
	$temp=Receive-Job -Name $job.Name
	if($temp)
	{
		$countOK++
	}
	else
	{
		$countKO++
		$output+=$job.Name+" - "
	}
}
if ($countKO -gt $maxError)
{
	$state="CRITICAL"
	$exitcode=2
}
elseif ($countKO -gt $maxWarn)
{
	$state="WARNING"
	$exitcode=1
}
else
{
	$state="OK"
	$exitcode=0
}

$output=$state+":"+$countOK+" online"+" - "+$countKO+" offline - "+$output
$output+='|'
$output+="online="+$countOK+";"+$maxWarn+";"+$maxError+";"+" "
$output+="offline="+$countKO+";"+$maxWarn+";"+$maxError+";"
Write-Host $output
exit $exitcode

7 réflexions au sujet de “Nagios: Superviser la santé Hyper-V 2012 – BPA & VM”

  1. Bonjour,

    Votre script fonctionne très bien en execution direct powershell.
    Par contre coté Nagios, avec NRPE voici le retour :

    CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.

    Auriez-vous une idée sachant que dont_blame_nrpe=1

    Merci d’avance

  2. Bonjour,

    Est-ce que d’autres appels fonctionnent via check_nrpe ?
    Vérifiez dans le nsclient.ini du serveur Windows que vous avez bien:
    [/settings/NRPE/server]
    allow nasty characters = true
    allow arguments=true

    Le dontblame=1 c’est dans la config du nrpe linux. Le linux ne fait que client et n’a pas a être serveur nrpe pour ce scénario.

  3. Bonjour,

    Oui d’autres appels fonctionnent bien avec check_nrpe, car je check l’état de mes backups Veeam avec.
    De plus, sans argument, le check_nrpe est ok :

    [root@SRV-CENTREON plugins]# ./check_nrpe -H 172.17.10.21
    I (0.4.3.88 2015-01-11) seem to be doing fine…

    [root@SRV-CENTREON plugins]# ./check_nrpe -H 172.17.10.21 -n -c check_hyper-v
    CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.

    J’ai ajouté vos variables mais sans changements…

  4. bonjour,
    excellent script ca marche nickel
    mais n’étant pas doué en powershell je voudrais savoir sur quel événement se base ce script?
    quel journal lit ce code pour renvoyer les états des vm hyperv?
    merci pour ces précisions
    cordialement

  5. Bonjour,

    il génère un rapport BPA (outil des meilleures pratiques Microsoft) et lit le résultat, en complément de certains tests.

  6. Bonjour,

    Merci pour le script, j’ai un problème, je voudrais exclure plusieurs VM, et quand j’insère plusieurs VM dans centreon, exemple: « SRV1, SRV2 » SRV1,SRV2 SRV1;SRV2 etc…
    Cela ne me comptabilise pas l’ensemble des VM insérées.
    J’ai essayé de modifier le script .ps1 mais trop compliqué pour moi cela me créer d’autres bugs..
    Comment puis-je faire ?

    Ou bien supprimer « VM not running » qui ne m’est pas utile.

    Merci

  7. Bonjour,

    Peut-on superviser une machine sans installer NSCLIENT sur la machine Windows ?

    Cordialement,

Laisser un commentaire