Supervision : Comment checker l’état de la synchronisation WSUS ?
Sommaire
I. Présentation
Au sein d'un tutoriel précédent, on avait vu comment exécuter des scripts PowerShell avec NRPE, je vous propose d'exploiter cette possibilité offerte par NSClient++ pour vérifier l'état de la synchronisation de votre serveur WSUS afin de l'intégrer à votre supervision.
Il est indispensable de s'assurer que son serveur WSUS synchronise correctement car sans cela, il ne va pas récupérer les dernières mises à jour auprès des serveurs Windows Update de Microsoft. Par conséquent, les mises à jour ne seront pas déployées auprès de vos clients.
Pour parvenir à cela, j'ai développé un script PowerShell qui récupère l'état de la synchronisation et qui retourne un état à la solution de supervision. En fonction de cet état, on peut générer une alerte si besoin. Cette solution s'appuie sur NSClient++ et NRPE.
II. Récupérer l'état de la synchronisation
Directement depuis le serveur WSUS, grâce à la commande "Get-WsusServer" on va pouvoir récupérer des informations sur l'état de la dernière synchronisation. En fait, il faut vérifier deux choses :
- L'état de la dernière synchronisation, elle doit être réussie
- La date de la dernière synchronisation, car la dernière peut être réussie mais elle peut dater de 10 jours, ce qui n'est pas normal
Grâce à la commande ci-dessous on va accéder à un ensemble de propriétés qui vont répondre à notre besoin :
(Get-WsusServer).GetSubscription().GetLastSynchronizationInfo()
En cas d'échec de synchronisation :
En cas de synchronisation réussie :
Ce sont les propriétés "Result" et "EndTime" que nous allons utiliser dans notre script.
III. Le script pour la vérification
Maintenant, il est temps de voir le script complet et que je vous fournisse quelques explications :
La variable $NumberOfDaysWithoutSync indique le nombre de jours sans synchronisation que l'on tolère. Par exemple, si la dernière synchronisation réussie remonte à plus de 7 jours, il y aura une alerte. Modifiez la valeur en fonction de vos besoins.
La variable $ExitCode retourne un code à NRPE qui sera ensuite renvoyé à votre solution de supervision. Si l'état est sur "0" alors c'est OK, si l'on retourne "2" c'est qu'il y a un problème de synchronisation.
Voici le code complet du script :
# Synopsys : Check status of WSUS Synchronization # Initial state $ExitCode = 0 # Variables $NumberOfDaysWithoutSync = 7 # Get the status of the last synchronization $WsusLastSyncOutput = (Get-WsusServer).GetSubscription().GetLastSynchronizationInfo() ## CHECK SYNC STATE # Normal state : Result = Succeeded if(!($WsusLastSyncOutput.Result -eq "Succeeded")){ $ExitCode = 2 Write-Output "CRITICAL: The last sync $($WsusLastSyncOutput.EndTime) state is $($WsusLastSyncOutput.Result)" } ## CHECK THE DATE OF THE LAST SYNC # Get the datetime of the last synchronization $WsusLastTimeOutput = (Get-WsusServer).GetSubscription().LastSynchronizationTime # Calculate the reference date $DateReference = (Get-Date).AddDays(-$NumberOfDaysWithoutSync) # If the last sync time is older than the calculate date (= date of the day - $NumberOfDaysWithoutSync) it's critical if($DateReference -gt $WsusLastTimeOutput){ $ExitCode = 2 Write-Output "CRITICAL: Last sync is older than $NumberOfDaysWithoutSync days and his state is $($WsusLastSyncOutput.Result)" } # Evaluate final exit code result for all passed checks. if ($ExitCode -eq 0) { Write-Output "OK: The last sync $($WsusLastSyncOutput.EndTime) state is $($WsusLastSyncOutput.Result)" } exit $ExitCode
Enregistrez ce bout de code dans un fichier et enregistrez-le dans le dossier "scripts" de NSClient++, par exemple avec le nom "Check-WsusSyncState.ps1". Vous pouvez personnaliser les messages de retour si vous le souhaitez, ce sont les messages qui s'afficheront sur l'interface de votre solution de monitoring.
IV. Configuration de NSClient++ pour ajouter le script
Maintenant, on va intégrer ce script à NSClient++ pour que l'on puisse l'appeler depuis notre solution de supervision, Centreon par exemple. Editez le fichier de configuration NSClient.ini et ajoutez cette ligne sous le bloc "[/settings/external scripts/scripts]". Pensez à vous référer à l'article mentionné au début de celui-ci pour la configuration de NRPE si nécessaire.
Sur la ligne ci-dessous, adaptez le nom de votre script PowerShell si nécessaire. Le premier terme, c'est à dire "Check-WsusSyncState" correspond au nom de la commande qu'il faudra appeler depuis Centréon, ensuite NSClient fait le lien entre ce nom de commande et le script à exécuter.
Check-WsusSyncState=cmd /c echo scripts\Check-WsusSyncState.ps1; exit($lastexitcode) | powershell.exe -command -
Pour finir, redémarrez le service NSClient++ pour prendre en compte cette nouvelle configuration.
V. Intégration à la supervision
En fonction de votre système de supervision, vous devrez ensuite effectuer la configuration pour appeler notre script via NRPE, votre commande de check ressemblera à ceci :
.\check_nrpe -H 192.168.1.150 -c Check-WsusSyncState
Lorsque tout sera prêt, vous allez obtenir un bel état de votre synchronisation WSUS dans votre Centréon (ou autre) :
Voilà, ce tutoriel est terminé ! Que pensez-vous de cette vérification ? Allez-vous l'implémenter ?
Super le script, j’essaye ça dès demain
Merci
Salut,
Perso j’ai un 403 forbidden
Salut,
A quel moment tu obtiens ça ?
Florian
Lors du (Get-WsusServer).GetSubscription().GetLastSynchronizationInfo()
C’est un W2012KR2, https est activé (obligatoire pour W10 je crois)
Tu peux essayer d’ajouter -UseSsl au cmdlet Get-WsusServer et/ou le numéro de port avec -Port.
Bien joué ! j’ai du rajouter aussi -Name (j’utilisais un virtual host pour ce serveur) ce qui donne cette commande (Get-WsusServer -Name wsus.int.domain.tld -UseSsl -Port 443).GetSubscription().GetLastSynchronizationInfo()
Merci
Super, ca marche bien
Un grand merci …
Parfait !
Merci ;o)
Super si tu en à d’autres de ce type je prends