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$
- [/settings/external scripts/wrapped scripts]
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
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