Introduction
Avec une infrastructure suffisamment grande et distribuée utilisant DFS comme point d'accÚs unique aux données et DFSR pour la réplication des données entre les centres de données et les serveurs filiales, la question du suivi de l'état de cette réplication se pose.
Il se trouve qu'Ă peu prĂšs au mĂȘme moment oĂč nous avons commencĂ© Ă utiliser DFSR, nous avons commencĂ© la mise en Ćuvre de Zabbix dans le but de remplacer le zoo d'outils variĂ©s existants et d'apporter une visibilitĂ© plus informative, complĂšte et logique au suivi de l'infrastructure. C'est de l'utilisation de Zabbix pour surveiller la rĂ©plication DFS dont nous allons parler.
Tout d'abord, nous devons déterminer quelles données de réplication DFS nous devons obtenir pour surveiller son état. L'indicateur le plus pertinent est le backlog. Il comprend les fichiers qui n'ont pas été synchronisés avec d'autres membres du groupe de réplication. On peut vérifier sa taille avec l'outil dfsrdiag, qui s'installe avec le rÎle DFSR. Dans un état de réplication normal, la taille du backlog devrait tendre vers zéro. Par conséquent, des valeurs élevées du nombre de fichiers dans le backlog indiquent des problÚmes de réplication.
Passons maintenant Ă la partie pratique de la question.
Pour surveiller la taille du backlog via Zabbix Agent, nous aurons besoin de :
- Un script qui va parser la sortie dfsrdiag pour fournir Ă Zabbix les valeurs finales de la taille du backlog,
- Un script qui va déterminer le nombre de groupes de réplication sur le serveur, quelles dossiers ils répliquent et quels autres serveurs y sont inclus (nous ne voulons pas entrer tout cela dans Zabbix manuellement pour chaque serveur, n'est-ce pas ?)
- L'ajout de ces scripts comme UserParameter dans la configuration de l'agent Zabbix pour un appel ultérieur depuis le serveur de surveillance,
- Le lancement du service de l'agent Zabbix sous un utilisateur ayant les droits de lecture du backlog,
- Un template pour Zabbix, oĂč seront configurĂ©s la dĂ©tection des groupes, le traitement des donnĂ©es obtenues et l'Ă©mission des alertes Ă leur sujet.
Script parseur
Pour écrire le parseur, j'ai choisi VBS comme langage le plus universel, présent dans toutes les versions de Windows Server. La logique de fonctionnement du script est simple : il reçoit via la ligne de commande le nom du groupe de réplication, du dossier répliqué, ainsi que les noms des serveurs d'envoi et de réception. Ensuite, ces paramÚtres sont passés à dfsrdiag, et en fonction de sa sortie, il délivre :
Le nombre de fichiers â si un message concernant la prĂ©sence de fichiers dans le backlog est reçu,
0 â si un message indiquant l'absence de fichiers dans le backlog («No Backlog») est reçu,
-1 â si un message d'erreur est reçu dfsrdiag lors de l'exĂ©cution de la requĂȘte ("[ERROR]").
get-Backlog.vbs
strReplicationGroup=WScript.Arguments.Item(0)
strReplicatedFolder=WScript.Arguments.Item(1)
strSending=WScript.Arguments.Item(2)
strReceiving=WScript.Arguments.Item(3)
Set WshShell = CreateObject ("Wscript.shell")
Set objExec = WSHshell.Exec("dfsrdiag.exe Backlog /RGName:""" & strReplicationGroup & """ /RFName:""" & strReplicatedFolder & """ /SendingMember:" & strSending & " /ReceivingMember:" & strReceiving)
strResult = ""
Do While Not objExec.StdOut.AtEndOfStream
strResult = strResult & objExec.StdOut.ReadLine() & "\"
Loop
If InStr(strResult, "No Backlog") > 0 then
intBackLog = 0
ElseIf InStr(strResult, "[ERROR]") > 0 Then
intBackLog = -1
Else
arrLines = Split(strResult, "\")
arrResult = Split(arrLines(1), ":")
intBackLog = arrResult(1)
End If
WScript.echo intBackLogScript de détection
Pour que Zabbix dĂ©tecte automatiquement tous les groupes de rĂ©plication prĂ©sents sur le serveur et qu'il dĂ©termine lui-mĂȘme tous les paramĂštres requis pour la requĂȘte (nom du dossier, noms des serveurs voisins), nous devons d'abord obtenir cette information, puis la prĂ©senter dans un format que Zabbix comprenne. Le format compris par l'outil de dĂ©couverte est le suivant :
"data":[
{
"{#GROUP}":"Share1",
"{#FOLDER}":"Folder1",
"{#SENDING}":"Server1",
"{#RECEIVING}":"Server2"}
...
"{#GROUP}":"ShareN",
"{#FOLDER}":"FolderN",
"{#SENDING}":"Server1",
"{#RECEIVING}":"ServerN"}]}Nous pouvons obtenir les informations qui nous intĂ©ressent plus facilement via WMI, en les rĂ©cupĂ©rant des sections appropriĂ©es de DfsrReplicationGroupConfig. Cela a donnĂ© naissance Ă un script qui forme une requĂȘte WMI et, en sortie, fournit une liste des groupes, de leurs dossiers et des serveurs au format requis.
DFSRDiscovery.vbs
dim strComputer, strLine, n, k, i
Set wshNetwork = WScript.CreateObject("WScript.Network")
strComputer = wshNetwork.ComputerName
Set oWMIService = GetObject("winmgmts:\" & strComputer & "rootMicrosoftDFS")
Set colRGroups = oWMIService.ExecQuery("SELECT * FROM DfsrReplicationGroupConfig")
wscript.echo "{"
wscript.echo " ""data"":["
n=0
k=0
i=0
For Each oGroup in colRGroups
n=n+1
Set colRGFolders = oWMIService.ExecQuery("SELECT * FROM DfsrReplicatedFolderConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
For Each oFolder in colRGFolders
k=k+1
Set colRGConnections = oWMIService.ExecQuery("SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
For Each oConnection in colRGConnections
i=i+1
binInbound = oConnection.Inbound
strPartner = oConnection.PartnerName
strRGName = oGroup.ReplicationGroupName
strRFName = oFolder.ReplicatedFolderName
If oConnection.Enabled = True and binInbound = False Then
strSendingComputer = strComputer
strReceivingComputer = strPartner
strLine1=" {"
strLine2=" ""{#GROUP}"":""" & strRGName & ""","
strLine3=" ""{#FOLDER}"":""" & strRFName & ""","
strLine4=" ""{#SENDING}"":""" & strSendingComputer & ""","
if (n < colRGroups.Count) or (k < colRGFolders.count) or (i < colRGConnections.Count) then
strLine5=" ""{#RECEIVING}"":""" & strReceivingComputer & """},"
else
strLine5=" ""{#RECEIVING}"":""" & strReceivingComputer & """}]}"
end if
wscript.echo strLine1
wscript.echo strLine2
wscript.echo strLine3
wscript.echo strLine4
wscript.echo strLine5
End If
Next
Next
Next
D'accord, le script n'est peut-ĂȘtre pas exemplaire en terme d'Ă©lĂ©gance de code et il y a probablement quelque chose Ă simplifier, mais il remplit avec succĂšs sa fonction principale : fournir des informations sur les paramĂštres des groupes de rĂ©plication dans un format comprĂ©hensible par Zabbix.
Intégration de scripts dans la configuration de l'agent Zabbix
C'est tout simple. Ajoutez les lignes suivantes Ă la fin du fichier de configuration de l'agent :
UserParameter=check_dfsr[*],cscript /nologo "C:Program FilesZabbix Agentget-Backlog.vbs" $1 $2 $3 $4
UserParameter=discovery_dfsr[*],cscript /nologo "C:Program FilesZabbix AgentDFSRDiscovery.vbs"
Bien sĂ»r, nous corrigeons les chemins en fonction de l'emplacement de nos scripts. Je les ai mis dans le mĂȘme dossier que l'agent est installĂ©.
AprÚs avoir apporté les modifications, redémarrez le service de l'agent Zabbix.
Modification de l'utilisateur sous lequel le service Zabbix Agent fonctionne
Pour obtenir des informations via dfsrdiag, l'outil doit ĂȘtre exĂ©cutĂ© sous un compte ayant des droits administratifs Ă la fois sur les membres d'envoi et de rĂ©ception du groupe de rĂ©plication. Le service d'agent Zabbix, par dĂ©faut sous le compte systĂšme, ne pourra pas effectuer cette demande. J'ai créé un compte distinct dans le domaine, lui ai donnĂ© des droits administratifs sur les serveurs nĂ©cessaires et configurĂ© sur ces serveurs le lancement du service Ă partir de celui-ci.
On peut aussi prendre une autre voie : puisque dfsrdiag, en pratique, fonctionne via la mĂȘme WMI, il est possible de profiter de , de comment donner Ă un compte de domaine des droits pour son utilisation sans accorder de droits administratifs, mais si nous avons beaucoup de groupes de rĂ©plication, accorder des droits Ă chaque groupe serait difficile. Cependant, si nous voulons surveiller la rĂ©plication de Domain System Volume sur les contrĂŽleurs de domaine, cela pourrait s'avĂ©rer ĂȘtre la seule option acceptable, car accorder des droits d'administrateur de domaine au compte du service de surveillance n'est pas la meilleure idĂ©e.
Template de surveillance
En me basant sur les données obtenues, j'ai créé un modÚle qui :
- Lance la détection automatique des groupes de réplication une fois par heure,
- Vérifie la taille du backlog pour chaque groupe toutes les 5 minutes,
- Contient un déclencheur émettant une alerte lorsque la taille du backlog pour un groupe dépasse 100 pendant 30 minutes. Le déclencheur est décrit comme un prototype, qui est automatiquement ajouté aux groupes détectés,
- Construit des graphiques de la taille du backlog pour chaque groupe de réplication.
Le template pour Zabbix 2.2 peut ĂȘtre tĂ©lĂ©chargĂ© .
Conclusion
AprÚs l'importation du template dans Zabbix et la création d'un compte avec les droits nécessaires, il nous suffira de copier les scripts sur les serveurs de fichiers que nous souhaitons surveiller en ce qui concerne le DFSR, d'ajouter deux lignes à la configuration de l'agent sur ceux-ci et de redémarrer le service de l'agent Zabbix, en le configurant pour qu'il s'exécute sous le compte approprié. Aucune autre configuration manuelle pour la surveillance du DFSR ne sera nécessaire.
Source : habr.com
