Proste monitorowanie replikacji DFS w Zabbix

Wprowadzenie

W przypadku dużej i rozproszonej infrastruktury, która używa DFS jako jednego punktu dostępu do danych i DFSR do replikacji danych między danymi centrami a serwerami oddziałów, pojawia się pytanie o monitorowanie stanu tej replikacji.
Zbiegiem okoliczności, że niemal natychmiast po rozpoczęciu korzystania z DFSR, rozpoczęliśmy wdrażanie Zabbix w celu zastąpienia istniejącego zróżnicowanego zestawu narzędzi i doprowadzenia monitoringu infrastruktury do bardziej informacyjnego, kompleksowego i logicznego kształtu. O użyciu Zabbix do monitorowania replikacji DFS będzie mowa.

Pierwszą rzeczą, którą musimy ustalić, jest to, jakie dane o replikacji DFS są potrzebne do nadzoru stanu tej replikacji. Najistotniejszym wskaźnikiem jest backlog. Wchodzą do niego pliki, które nie zostały zsynchronizowane z innymi członkami grupy replikacji. Jego rozmiar można sprawdzić przy pomocy narzędzia dfsrdiag, które jest instalowane razem z rolą DFSR. W normalnym stanie replikacji, rozmiar backlogu powinien dążyć do zera. W związku z tym, duże wartości liczby plików w backlogu świadczą o problemach z replikacją.

Teraz przejdźmy do praktycznej strony zagadnienia.

Aby monitorować rozmiar backlogu przez Zabbix Agent, potrzebujemy:

  • Skryptu, który będzie analizować dane wyjściowe dfsrdiag w celu dostarczenia w Zabbix końcowych wartości rozmiaru backlogu,
  • Skryptu, który określi, ile grup replikacji jest na serwerze, jakie foldery są replikowane oraz które inne serwery wchodzą w skład tych grup (nie chcemy wpisywać tego wszystkiego ręcznie w Zabbix dla każdego serwera, prawda?),
  • Dodania tych skryptów jako UserParameter do konfiguracji agenta Zabbix, aby można je było później wywołać z serwera monitorującego,
  • Uruchomienia usługi agenta Zabbix jako użytkownik, który ma prawo do odczytu backlogu,
  • Szablonu dla Zabbix, w którym zostanie skonfigurowane wykrywanie grup, przetwarzanie otrzymanych danych oraz wydawanie alertów na ich podstawie.

Skrypt analizy

Do napisania skryptu analizy wybrałem VBS jako najuniwersalniejszy język, obecny we wszystkich wersjach Windows Server. Logika działania skryptu jest prosta: za pomocą wiersza polecenia otrzymuje on nazwę grupy replikacji, replikowanego folderu oraz nazwy serwerów sending i receiving. Następnie te parametry są przekazywane do dfsrdiag, a w zależności od jej wyników wydawane jest:
Liczba plików — jeśli otrzymano informację o obecności plików w backlogu,
0 — jeśli otrzymano komunikat o braku plików w backlogu („No Backlog”),
-1 — jeśli otrzymano komunikat o błędzie dfsrdiag podczas wykonywania zapytania ("[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

Skrypt detekcji

Aby Zabbix mógł sam wykrywać wszystkie grupy replikacji obecne na serwerze i sam ustalać wszystkie wymagane parametry do zapytania (nazwa folderu, nazwy serwerów sąsiednich), musimy te informacje najpierw uzyskać, a następnie przedstawić je w zrozumiałym dla Zabbix formacie. Format, który rozumie narzędzie discovery, wygląda następująco:

        "data":[
                {
                        "{#GROUP}":"Share1",
                        "{#FOLDER}":"Folder1",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"Server2"}

...

                        "{#GROUP}":"ShareN",
                        "{#FOLDER}":"FolderN",
                        "{#SENDING}":"Server1",
                        "{#RECEIVING}":"ServerN"}]}

Najłatwiej jest uzyskać interesujące nas informacje przez WMI, wyciągając je z odpowiednich sekcji DfsrReplicationGroupConfig. W rezultacie powstał skrypt, który formułuje zapytanie do WMI i na wyjściu zwraca listę grup, ich folderów i serwerów w wymaganym formacie.

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

Zgadzam się, skrypt może nie jest najdoskonalszy i na pewno można coś uprościć, ale swoją główną funkcję — dostarczanie informacji o parametrach grup replikacji w formacie zrozumiałym dla Zabbixa — wykonuje skutecznie.

Dodawanie skryptów do konfiguracji agenta Zabbix

Tutaj wszystko jest bardzo proste. Na końcu pliku konfiguracyjnego agenta dodajemy poniższe linie:

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"

Oczywiście, ścieżki należy dostosować do tych, w których znajdują się nasze skrypty. Położyłem je w tym samym folderze, co zainstalowany agent.

Po wprowadzeniu zmian restartujemy usługę agenta Zabbix.

Zmiana użytkownika, pod którym działa usługa Zabbix Agent

Aby uzyskać informacje przez dfsrdiag, narzędzie musi być uruchamiane z konta użytkownika, które ma uprawnienia administracyjne zarówno dla członków grupy wysyłającej, jak i odbierającej replikację. Domyślnie uruchamiana usługa agenta Zabbix na koncie systemowym nie będzie mogła zrealizować takiego żądania. Utworzyłem osobne konto w domenie, nadałem mu uprawnienia administracyjne na odpowiednich serwerach i skonfigurowałem uruchamianie usługi na tych serwerach z tego konta.

Można pójść i inną drogą: ponieważ dfsrdiag, w zasadzie, działa przez ten sam WMI, można skorzystać z opisania, jak nadać domenowemu kontu użytkownika uprawnienia do jego użycia bez przyznawania uprawnień administracyjnych, ale jeśli mamy wiele grup replikacji, to nadawanie uprawnień każdej grupie może być problematyczne. Jednak w przypadku, gdy zechcemy monitorować replikację Domain System Volume na kontrolerach domeny, to może być jedyna akceptowalna opcja, ponieważ przyznawanie uprawnień administratora domeny kontu usługi monitorującej — to nie jest najlepszy pomysł.

Szablon monitorowania

Na podstawie zebranych danych stworzyłem szablon, który:

  • Co godzinę uruchamia automatyczne wykrywanie grup replikacji,
  • Co 5 minut kontroluje rozmiar backlogu dla każdej grupy,
  • Zawiera wyzwalacz, który generuje alert, gdy rozmiar backlogu dla dowolnej grupy przekracza 100 przez 30 minut. Wyzwalacz opisany jest jako prototyp, który automatycznie dodaje się do wykrytych grup,
  • Tworzy wykresy rozmiaru backlogu dla każdej grupy replikacji.

Można pobrać szablon dla Zabbix 2.2 tutaj.

Podsumowanie

Po imporcie szablonu do Zabbix i utworzeniu konta z odpowiednimi uprawnieniami wystarczy kopia skryptów na serwery plików, które chcemy monitorować w zakresie DFSR, dodanie dwóch linii do konfiguracji agenta na nich i ponowne uruchomienie usługi agenta Zabbix, konfigurowując jej uruchamianie z konta użytkownika. Żadne inne ręczne ustawienia do monitorowania DFSR nie będą potrzebne.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster