PI Services

Le blog des collaborateurs de PI Services

Nagios – NRPE: Exemple de supervision AD

 

L’exemple suivant montre l’utilisation du plugin check_nrpe avec un script vbs check_ad.vbs pour la supervision des principaux services Active Directory. (NB: Le script check_ad parse la sortie de dcdiag.exe pour déterminer des états)

Prérequis:

      • Sur le serveur Nagios: Serveur NRPE actif
        • Sur le contrôleur de domaine cible: utilitaire dcdiag.exe ; Agent NSCP actif ; NRPE Server activé dans le fichier nsclient.ini (NRPEServer = 1)
               
      Le script utilisé est disponible sur le lien

https://exchange.nagios.org/components/com_mtree/attachment.php?link_id=2332&cf_id=241/

      on copie le script en tant que check_ad.vbs, dans le dossier des scripts de l’agent nscp (par défaut “C:\Program Files\NSClient++\scripts”

2/

    on indique dans le fichier de configuration nsclient.ini l’alias et le chemin correspondant de la manière suivante

; A list of scripts available to run from the CheckExternalScripts module. Syntax is: <command>=<script> <arguments>
[/settings/external scripts/scripts]

check_ad=cscript.exe //Nologo scripts\\check_ad.vbs

 

3/ on redémarre le service NSClient++

 

4/ Sur le serveur Nagios depuis le répertoire des plugins contenant check_nrpe, on teste la commande:   ./check_nrpe -H 192.168.0.55 -c check_ad

 

5/ Définition de la commande dans le fichier command.cfg

#####################################
### COMMANDES VIA CHECK_NRPE #######

# 'check_ad' command definition
define command{
        command_name    check_ad
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c check_ad
        }

 

6/ Création du service correspondant dans le fichier contenant les definitions de services:

define service{
        use                             local-service
        host_name                       homeserv1
        service_description             AD DCDIAG Result
        check_command                   check_ad

 

 

7/ Le résultat après quelques secondes dans l’affichage d’état du contrôleur de domaine concerné:

image

Script Powershell – Nagios: Alimentation de fichiers d’hôtes

 

Le script suivant:

- interroge l’AD pour récupérer une liste des machines serveurs à superviser

- Détermine si la machine est reconnu (DNS)

- Détermine si la machine répond au ping

- Détermine si la machine héberge le client NSClient++ (NSCP)

- Sur la base de ces infos, des fichiers de config d’hôtes sont construit, une archive du jour (tar.gz) des fichiers à remplacer est créé dans le même répertoire. Les fichiers de conf sont ensuite envoyés par FTP dans le répertoire « /usr/local/nagios/etc/objects/HOME/HOSTS/ » du serveur nagios.

Le demon nagios est redémarré à la suite.

 

 

SCOM – Mise a jour de MP Author en SP3

 

L’outil gratuit de création de management pack de Silect Software a été mis  a jour en SP3

http://www.silect.com/mp-author 

Au menu:

- Amélioration de la visualisation et de l'édition des KB

- Amélioration de l’edition du XML

- Détection des oublis de champs DisplayName

- Possibilité d’utiliser les “Bases classes” a la place de LocalApplication en tant que cible d’une nouvelle classe.

- Affichage d’objets supplémentaires issus des MP

-  Ajout d’une liste dynamique de variable pour la customisation des messages d’alertes.

- Amélioration de la gestion de la mémoire utilisée.

Rapports SCOM – Ebook gratuit

Un nouvel ebook gratuit est disponible et concerne la création de rapports Reporting Services pour SCOM.

Au menu:

  1. Chapter 1 Operations Manager and the cloud

  2. Chapter 2 Operations Manager reporting basics

  3. Chapter 3 Working with reports

  4. Chapter 4 Overview of report authoring tools

  5. Chapter 5 Authoring reports in Report Builder

  6. Chapter 6 Authoring reports in SQL Server Data Tools

  7. Chapter 7 Building management packs for reporting

  8. Chapter 8 Authoring dashboards in Power View

  9. Chapter 9 Troubleshooting reporting in Operations Manager

 

http://www.microsoftvirtualacademy.com/ebooks#9780735695788

SCOM – VbScript de surveillance de modification régulière d’un dossier

 

Le script suivant surveille qu’un dossier donné en paramètre (chemin au format wmi) est bien modifié régulièrement (Laps de temps en minutes au delà duquel un état KO est généré si le dossier n'a pas été modifié).

Le script est directement utilisable dans un script monitor en passant en paramètre les paramètres strDirName et MinuteOffset.

Lien du script plus bas.

 

Option Explicit '####################################################### 'Script verifiant qu un dossier est bien modifié regulierement 'Le script affiche OK ou KO et repercute l état a SCOM 'ARGUMENTS: 'strDirName(Nom complet du repertoire au format wmi => Ex: D:\\Test\\MyDirectory 'MinuteOffSet(Laps de temps en minutes pendant lequel le dossier n est pas modifié) '####################################################### Dim oArgs Set oArgs = Wscript.Arguments Dim strDirName Dim strComputer Dim objSWbemServices Dim colDirectories Dim objDirectory Dim MinuteOffSet Dim dateNow Dim dateNowMinus Dim oAPI Dim oBag Dim strStatus 'CREATION OBJET SCOM Set oAPI = CreateObject("MOM.ScriptAPI") if oArgs.Count <2 Then 'If the script is called without the required argument, 'create an information event and then quit. wscript.echo "Le script a ete appele sans le nombre minimum d'argument (2)" Call oAPI.LogScriptEvent(WScript.ScriptName,851,0,WScript.ScriptName+" Le script a été appelé sans le nombre minimum d'argument (2)") Wscript.Quit -1 Else 'Log evenement: lancement du script OK Call oAPI.LogScriptEvent(WScript.ScriptName,852,0,WScript.ScriptName+" script was launched successfully") End If '###FONCTION DE FORMATAGE DE DATE########################### function formatDate(format, intTimeStamp) dim unUDate, A ' Test to see if intTimeStamp looks valid. If not, they have passed a normal date if not (isnumeric(intTimeStamp)) then if isdate(intTimeStamp) then intTimeStamp = DateDiff("S", "01/01/1970 00:00:00", intTimeStamp) else response.write "Date Invalid" exit function end if end if if (intTimeStamp=0) then unUDate = now() else unUDate = DateAdd("s", intTimeStamp, "01/01/1970 00:00:00") end if unUDate = trim(unUDate) dim startM : startM = InStr(1, unUDate, "/", vbTextCompare) + 1 dim startY : startY = InStr(startM, unUDate, "/", vbTextCompare) + 1 dim startHour : startHour = InStr(startY, unUDate, " ", vbTextCompare) + 1 dim startMin : startMin = InStr(startHour, unUDate, ":", vbTextCompare) + 1 dim dateDay : dateDay = mid(unUDate, 1, 2) dim dateMonth : dateMonth = mid(unUDate, startM, 2) dim dateYear : dateYear = mid(unUDate, startY, 4) dim dateHour : dateHour = mid(unUDate, startHour, 2) dim dateMinute : dateMinute = mid(unUDate, startMin, 2) dim dateSecond : dateSecond = mid(unUDate, InStr(startMin, unUDate, ":", vbTextCompare) + 1, 2) format = replace(format, "%Y", right(dateYear, 4)) format = replace(format, "%y", right(dateYear, 2)) format = replace(format, "%m", dateMonth) format = replace(format, "%n", cint(dateMonth)) format = replace(format, "%F", monthname(cint(dateMonth))) format = replace(format, "%M", left(monthname(cint(dateMonth)), 3)) format = replace(format, "%d", dateDay) format = replace(format, "%j", cint(dateDay)) format = replace(format, "%h", mid(unUDate, startHour, 2)) format = replace(format, "%g", cint(mid(unUDate, startHour, 2))) if (cint(dateHour) > 12) then A = "PM" else A = "AM" end if format = replace(format, "%A", A) format = replace(format, "%a", lcase(A)) if (A = "PM") then format = replace(format, "%H", left("0" & dateHour - 12, 2)) format = replace(format, "%H", dateHour) if (A = "PM") then format = replace(format, "%G", left("0" & cint(dateHour) - 12, 2)) format = replace(format, "%G", cint(dateHour)) format = replace(format, "%i", dateMinute) format = replace(format, "%I", cint(dateMinute)) format = replace(format, "%s", dateSecond) format = replace(format, "%S", cint(dateSecond)) format = replace(format, "%L", WeekDay(unUDate)) format = replace(format, "%D", left(WeekDayName(WeekDay(unUDate)), 3)) format = replace(format, "%l", WeekDayName(WeekDay(unUDate))) format = replace(format, "%U", intTimeStamp) format = replace(format, "11%O", "11th") format = replace(format, "1%O", "1st") format = replace(format, "12%O", "12th") format = replace(format, "2%O", "2nd") format = replace(format, "13%O", "13th") format = replace(format, "3%O", "3rd") format = replace(format, "%O", "th") formatDate = format end function '##################################################################### '###FONCTION DE CONVERSION DE DATE WMI EN DATE STANDARD (UTC)######### Function WMIDateStringToDate(dtmInstallDate) WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & _ Mid(dtmInstallDate, 7, 2) & "/" & Left(dtmInstallDate, 4) _ & " " & Mid (dtmInstallDate, 9, 2) & ":" & _ Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate, _ 13, 2)) End Function '##################################################################### 'NOM DU DOSSIER AU FORMAT WMI strDirName=oArgs(0) 'NOMBRE DE MINUTES MinuteOffSet=oArgs(1) dateNowMinus=DateAdd("n",-MinuteOffSet,formatDate("%n/%d/%Y %h:%i:%s", Now())) wscript.Echo "FORMAT DE DATE US (MM/dd/YYYY) => SI BESOIN MODIFIER LE FORMATAGE EFFECTUEE PAR LA FONCTION formatDate SUR LA VARIABLE Now" wscript.Echo "" & vbCrLf wscript.Echo "H:" wscript.Echo formatDate("%n/%d/%Y %h:%i:%s", Now()) wscript.Echo "" & vbCrLf wscript.Echo "H-"&MinuteOffSet&"minutes:" wscript.Echo dateNowMinus wscript.Echo "" & vbCrLf strComputer = "." Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colDirectories = objSWbemServices.ExecQuery("select * from win32_directory where name='" & strDirName & "'") For each objDirectory in colDirectories Wscript.Echo objDirectory.Name Wscript.Echo "LastModified: "& WMIDateStringToDate(objDirectory.LastModified) &"" If WMIDateStringToDate(objDirectory.LastModified) > dateNowMinus Then Wscript.Echo "Dossier modifié plus recemment que "& dateNowMinus &" => OK" strStatus="OK" Else Wscript.Echo "Dossier non modifié depuis plus de "& MinuteOffSet &" minutes => KO" strStatus="KO" End If Next Set oBag = oAPI.CreatePropertyBag() If strStatus = "OK" then Call oBag.AddValue("Status","Success") wscript.echo "Healthy" Call oAPI.Return(oBag) Else strStatus = "KO" Call oBag.AddValue("Status","Critical") wscript.echo "Critical" Call oAPI.Return(oBag) End if

 

Exchange 2010 / SCOM : Erreur après la désactivation de l’agent de scripting

Introduction

Dans un précédent article, nous avons découvert l'agent de scripting dans Exchange (http://blog.piservices.fr/post/Exchange-Decouverte-de-lagent-de-scripting.aspx). Pour rappel, cela permet  les fonctionnalités de base des cmdlets Exchange. Ainsi, on peut par exemple ajouter automatiquement une boîte d'archive au moment de la création de sa boîte aux lettres. Pour que cette opération fonctionne, il faut activer l'agent de scripting via la cmdlet “Enable-CmdletExtensionAgent”.

Cependant, si vous êtes amenés à désactiver cet agent ultérieurement, vous pouvez rencontrer de nombreuses erreurs avec l'event ID “6” dans le journal “MSExchange Management”.

Event

Ces erreurs peuvent être normales, lorsqu’un administrateur Exchange s'est trompé dans la syntaxe d'une cmdlet Powershell.

Contexte

Dans certaines situations ces erreurs sont à l’origine du mauvais  fonctionnement d'un composant tiers. En l'occurrence, comme nous allons le voir ici, il s'agit de System Center Operations Manager (SCOM). En effet, le Management Pack SCOM d'Exchange lance de nombreuses cmdlets afin d'effectuer des tests de vérification d'intégrité de l'infrastructure Exchange. A cause, de cette erreur, la supervision de l'infrastructure Exchange peut ne plus être opérationnelle.

Explication

Si on affiche l'erreur au format XML dans l’observateur d’événements, on obtient plus de détails :

 

Il est indiqué qu'Exchange ne trouve pas le fichier de configuration de l'agent de scripting : “File is not found: 'D:\Program Files\Microsoft\Exchange Server\V14\Bin\CmdletExtensionAgents\ScriptingAgentConfig.xml'”.

Cependant, si l'agent de scripting a été désactivé, il n'y a aucune raison qu'il soit utilisé. Pour rappel, le fichier de configuration ne doit être présent que si l'agent de scripting est démarré. Il est à noter que même si ce fichier est présent, l'erreur continue d'apparaître. Le message indiqué dans l'erreur n'est donc pas pertinent. En réalité, il s'avère que le service “Exchange Monitoring” ne prend pas en compte le changement de configuration. Il est utilisé par le management pack SCOM et permet d'executer toutes les cmdlets de diagnostics comme “Test-PopConnectivity”, “Test-MRSHealth”, “Test-ReplicationHealth”, ...

Résolution

Pour résoudre cette erreur, il suffit de redémarrer le service "Exchange Monitoring". Ainsi, la configuration des cmdlets extensions agents sera correctement prise en compte. 

Exchange Monitoring Service

Pour information, ce service peut être redémarré sans incidence.

NB : Il faut redémarrer ce service sur tous les serveurs de l'organisation Exchange car l'opération d'activation/désactivation de l'agent de scripting se fait sur la totalité de ceux-ci.

SCOM et alertes WMI: Script de redémarrage du service wmi et de ses dépendances

 

Le script suivant récupère les alertes ouvertes pour une machine, qui correspondent a des erreurs de requetage wmi. Si il en trouve au moins une dont le repeatcount est supérieur a une valeur donnée en variable, il redémarre le service wmi et ses dépendances et clos les alertes correspondantes.

   1:  
   2: $scomms="scom2k12sp1srv1"
   3: $targetcomputer="scom2k12sp1dc1"
   4: $repeatcountthreshold="1"
   5: $wmi="WinMgmt"
   6:  
   7: $scomcred=Get-Credential -Credential "scom2k12sp1maq1\administrator"
   8: $arrwmialerts=@(“Operations Manager failed to run a WMI query","Workflow Initialization: Failed to start a workflow that queries WMI for performance data","Workflow Initialization: Failed to start a workflow that queries WMI for WMI events","Operations Manager failed to run a WMI query for WMI events",
   9: "Operations Manager failed to run a performance data WMI query","Workflow Initialization: Failed to start a workflow that queries WMI","Script Based Test Failed to Complete")
  10:  
  11: Import-Module operationsmanager
  12:  
  13: New-SCOMManagementGroupConnection -ComputerName $scomms -Credential $scomcred
  14:  
  15: $arrcomputernewalertnames=Get-SCOMAlert | Where-Object {$_.Resolutionstate -eq "0" -and $_.NetbiosComputerName -eq $targetcomputer -and $_.RepeatCount -gt $repeatcountthreshold -and $_.IsMonitorAlert -eq $false } | Select-Object -Property name -ExpandProperty name
  16: $arrcomputernewalerts=Get-SCOMAlert | Where-Object {$_.Resolutionstate -eq "0" -and $_.NetbiosComputerName -eq $targetcomputer -and $_.RepeatCount -gt $repeatcountthreshold -and $_.IsMonitorAlert -eq $false }
  17:  
  18:  
  19:  
  20: $matchingalerts=0
  21: foreach ($wmialert in $arrwmialerts)
  22: {
  23:   if ($arrcomputernewalertnames -contains $wmialert)
  24:     {
  25:     Write-Host -ForegroundColor Red -BackgroundColor White "L'alerte "$wmialert.ToUpper()" a été répétée plus de $repeatcountthreshold fois sur $targetcomputer"
  26:     Write-Host -ForegroundColor Yellow "Fermeture de l'alerte "$wmialert.ToUpper()" avant redemarrage du service $wmi et de ses dependances"
  27:     $matchingalerts= ($matchingalerts + 1)
  28:     $arrcomputernewalerts | Where-Object {$_.Name -like "$wmialert*"} | foreach {Set-SCOMAlert -ResolutionState 255 -Alert $_ }
  29:     }
  30: }
  31:  
  32:  
  33: ###FUNCTIONS###
  34: Function Restart-Wmi ($targetcomputer)
  35: {
  36: Invoke-Command -ComputerName $targetcomputer -Credential $scomcred -ScriptBlock {
  37: $winmgmt=Get-Service -Name Winmgmt
  38: $winmgmtrundep=$winmgmt.DependentServices | Where-Object {$_.Status -eq "Running"}
  39: Stop-Service -Name Winmgmt -Force -ErrorAction SilentlyContinue
  40: Start-Sleep -Seconds 5
  41: Start-Service -Name Winmgmt -ErrorAction silentlycontinue
  42: Start-Sleep -Seconds 5
  43:  
  44: foreach ($dep in $winmgmtrundep) 
  45:     {
  46:     if (Get-WmiObject win32_service | Where-Object {$_.Name -eq $dep.Name -AND $_.state -ne "running" -AND $_.startmode -eq "Auto"}) 
  47:         {
  48:         write-host -ForegroundColor Green "demarrage de la dependance "$dep.Name.ToUpper()""
  49:         Start-Service -Name $dep.Name -erroraction SilentlyContinue -ErrorVariable ("start_"+$dep.Name+"_error").ToString()
  50:         }
  51:     }
  52:  
  53: }
  54: }
  55:  
  56:  
  57: Function NewEventSource
  58: {
  59:     if(!(Test-Path 'HKLM:\SYSTEM\CurrentControlSet\services\eventlog\Operations Manager\RestartWMIScript'))
  60:     {
  61:     New-EventLog -LogName "Operations Manager" -Source RestartWMIScript
  62:     }
  63: }
  64: ###FUNCTIONS###
  65:  
  66:  
  67:  
  68:  
  69:  
  70:  
  71: if ($matchingalerts -gt 0)
  72: {
  73: write-host -ForegroundColor Yellow "Redemarrage du service WinMgmt et de ses dependances"
  74: Restart-Wmi $targetcomputer
  75: }
  76: else
  77: {
  78: write-host -ForegroundColor Green "Pas d'alertes correspondantes trouvées"
  79: Write-Host -ForegroundColor Green "Pas de redemarrage du service WinMgmt et de ses dependances"
  80: exit
  81: }
  82:  
  83:  
  84:  
  85:  
  86:  
  87: ###VERIFICATION ET LOG D'ERREURS
  88:  
  89:  
  90: Invoke-Command -ComputerName $targetcomputer -Credential $scomcred -ScriptBlock {
  91: param($targetcomputer)
  92: $wmi=Get-Service -Name WinMgmt -ComputerName $targetcomputer
  93: if ($wmi.Status -ne "Running")
  94: {
  95: $function:NewEventSource
  96: Write-EventLog -LogName 'Operations Manager' -Source RestartWMIScript -EntryType Error -EventId 1002 -Message "erreur de demarrage du service winmgmt"
  97: }
  98:  
  99: } -Argumentlist $targetcomputer
 100:  
 101: ###VERIFICATION ET LOG D'ERREURS
 102:  
 103:  
 104:  

System Center Advisor : Supervision en ligne

 

System Center Advisor est un nouveau service de supervision proposé par la plate-forme cloud Azure, permettant de visualiser en ligne au travers de dashboards basés sur des composants graphiques Silverlight, l’état de santé des applications ci-dessous:

  • Windows Server 2008, 2008 R2 et 2012

  • Active Directory

  • Hyper-V

  • Windows operating system

  • SQL Server
  • SharePoint 2010 et supérieur
  • Exchange Server 2010 et supérieur
  • Lync Server 2010 et supérieur
    En pratique, les serveurs ci-dessus communique avec une ou plusieurs Gateways SCOM, elles même connecté a la plateforme System Center Advisor dans le cloud Azure.
    Ce service gratuit se configure a travers les étapes suivantes:
image

 

- Récupération en ligne des sources de la Gateway et des agents

- Installation de la Gateway et des agents sur le périmètre de supervision.

- Enregistrement de la Gateway et approbation des agents

- Configuration de Runas accounts (Pour Sharepoint et Lync)

 

L’interface de supervision en ligne permet de visualiser l'état des composants, les alertes générés…a travers plusieurs types de vues.

SCOM – Principes de désactivation totale d’un management pack pour une machine sans le mode maintenance.

 

Pour des raisons autres que la maintenance ponctuelle d’une machine, il peut être intéressant de facilement désactiver la supervision liée a tout un management pack et ceci pour une ou plusieurs machine.

En effet, le mode maintenance de SCOM répond a un besoin plus ponctuel de mise en pause de la supervision. De plus il est conçu pour agir sur une classe d’objet et non pour des groupes de moniteur en particulier.

L’exemple suivant consiste a vouloir désactiver la supervision de Exchange 2010 pour une machine.

Le principe:

1/ Creer un management pack vide qui accueillera les modifications ainsi qu’un groupe:

image

2/ Creation d’un groupe qui sera la cible de tout les overrides crée plus bas.

image

3/ Création de tout les overrides sur tout les objets de monitoring (règles et moniteur) activés par défaut dans le management pack natif Exchange 2010, avec comme cible le groupe CUSTO_Group_CUSTO-Exchange2K10_Monitoring.

IMPORTANT: Cette création (assez fastidieuse surtout pour le MP Exchange !) n’est en fait a realiser qu’une seule fois. A partir du moment ou les overrides sont crées, on agit sur le groupe crée.

4/ Dans l’exemple d’exchange 2010 il suffit d’ajouter a notre groupe les 2 classes/groupes suivants:

- Microsoft Exchange 2010 All Entities Group

- Organization

(en effet l’ajout de ces 2 classes permettent de desactiver toute la supervision Exchange 2010)

Soit de maniere explicite (Add-remove Object)

image

Soit de maniere dynamique (onglet “dynamic members” avec la formule d’inclusion suivante:

image

image

 

Apres avoir validé, au bout de quelques minutes, le serveur cible n’héritera de plus aucune règle et moniteur Exchange 2010.