Surveillance simple de la réplication DFS dans Zabbix

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 intBackLog

Script 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 la description, 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é ici.

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

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster