Proste monitorowanie replikacji DFS w Zabbix

Wprowadzenie

Przy dość dużej i rozproszonej infrastrukturze, która wykorzystuje DFS jako pojedynczy punkt dostępu do danych oraz DFSR do replikacji danych pomiędzy centrami danych a serwerami oddziałowymi, pojawia się pytanie o monitorowanie stanu tej replikacji.
Przypadkowo, niemal natychmiast po tym, jak zaczęliśmy używać DFSR, zaczęliśmy wdrażać Zabbix w celu zastąpienia istniejącego zoo różnymi narzędziami i nadania monitorowaniu infrastruktury bardziej informacyjnej, kompletnej i logicznej formy. Porozmawiamy o użyciu Zabbix do monitorowania replikacji DFS.

Przede wszystkim musimy zdecydować, jakie dane dotyczące replikacji DFS należy pozyskać, aby monitorować jej stan. Najważniejszym wskaźnikiem są zaległości. Zawiera pliki, które nie zostały zsynchronizowane z innymi członkami grupy replikacji. Możesz zobaczyć jego rozmiar za pomocą narzędzia dfsrdiag, instalowany z rolą DFSR. W normalnym stanie replikacji rozmiar zaległości powinien zbliżać się do zera. W związku z tym duża liczba plików w zaległościach wskazuje na problemy z replikacją.

Teraz o praktycznej stronie problemu.

Aby monitorować wielkość backlogu poprzez Agenta Zabbix będziemy potrzebować:

  • Skrypt, który będzie analizować dane wyjściowe dfsrdiag aby dostarczyć Zabbixowi ostateczne wartości wielkości backlogu,
  • Skrypt, który określi, ile grup replikacji znajduje się na serwerze, jakie foldery są replikowane i jakie inne serwery się w nich znajdują (nie chcemy tego wszystkiego ręcznie wprowadzać do Zabbix dla każdego serwera, prawda?),
  • Dodanie tych skryptów jako parametru użytkownika do konfiguracji agenta Zabbix w celu późniejszego wywołania z serwera monitorującego,
  • Uruchomienie usługi agenta Zabbix jako użytkownik posiadający uprawnienia do odczytu backlogu,
  • Szablon dla Zabbix, w którym skonfigurowane zostanie wykrywanie grup, przetwarzanie otrzymanych danych i wystawianie na ich temat alertów.

Parser skryptów

Do napisania parsera wybrałem VBS jako najbardziej uniwersalny język występujący we wszystkich wersjach Windows Server. Logika skryptu jest prosta: otrzymuje on nazwę grupy replikacji, folder replikowany oraz nazwy serwerów wysyłających i odbierających za pośrednictwem wiersza poleceń. Parametry te są następnie przekazywane do dfsrdiagi w zależności od wyniku wytwarza:
Liczba plików – w przypadku otrzymania komunikatu o obecności plików w backlogu,
0 — w przypadku otrzymania komunikatu o braku plików w backlogu („Brak Backlogu”),
-1 - jeśli otrzymano komunikat o błędzie dfsrdiag podczas wykonywania żądania („[BŁĄD]”).

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 odkrycia

Aby Zabbix mógł określić wszystkie grupy replikacji obecne na serwerze i poznać wszystkie parametry wymagane dla żądania (nazwa folderu, nazwy sąsiadujących serwerów), musimy po pierwsze uzyskać tę informację, a po drugie ją przedstawić w formacie zrozumiałym dla Zabbix. Format obsługiwany przez narzędzie do wykrywania wygląda następująco:

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

...

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

Najłatwiej uzyskać interesujące nas informacje poprzez WMI, wyciągając je z odpowiednich sekcji DfsrReplicationGroupConfig. W rezultacie powstał skrypt, który generuje żądanie do WMI i wyświetla 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 błyszczy elegancją kodu i pewne rzeczy w nim na pewno można by uprościć, ale spełnia swoją główną funkcję - dostarcza informacji o parametrach grup replikacyjnych w formacie zrozumiałym dla Zabbixa.

Dodawanie skryptów do konfiguracji agenta Zabbix

Wszystko tutaj jest niezwykle proste. Dodaj następujące wiersze na końcu pliku konfiguracyjnego agenta:

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"

Ścieżki oczywiście dopasowujemy do tych, gdzie mamy skrypty. Umieściłem je w tym samym folderze, w którym zainstalowany jest agent.

Po dokonaniu zmian zrestartuj usługę agenta Zabbix.

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

Aby otrzymywać informacje poprzez dfsrdiag, narzędzie musi zostać uruchomione na koncie mającym uprawnienia administracyjne zarówno do wysyłających, jak i odbierających członków grupy replikacji. Usługa agenta Zabbix, domyślnie uruchomiona na koncie systemowym, nie będzie w stanie wykonać takiego żądania. Utworzyłem osobne konto w domenie, nadałem mu uprawnienia administracyjne na niezbędnych serwerach i skonfigurowałem usługę tak, aby działała w ramach niej na tych serwerach.

Możesz pójść inną drogą: ponieważ dfsrdiagw rzeczywistości działa przez tę samą usługę WMI, możesz z niej skorzystać opis, jak nadać kontu domeny uprawnienia do korzystania z niej bez wydawania praw administracyjnych, ale jeśli mamy wiele grup replikacji, to nadanie praw każdej grupie będzie trudne. Jeśli jednak chcemy monitorować replikację woluminu systemu domeny na kontrolerach domeny, może to być jedyna akceptowalna opcja, ponieważ nadawanie uprawnień administratora domeny do konta usługi monitorowania nie jest dobrym pomysłem.

Szablon monitorowania

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

  • Uruchamia automatyczne wykrywanie grup replikacji raz na godzinę,
  • Sprawdza wielkość zaległości dla każdej grupy raz na 5 minut,
  • Zawiera wyzwalacz, który generuje alert, gdy rozmiar zaległości dla dowolnej grupy przekracza 100 przez 30 minut. Trigger opisywany jest jako prototyp, który jest automatycznie dodawany do wykrytych grup,
  • Tworzy wykresy wielkości zaległości dla każdej grupy replikacji.

Możesz pobrać szablon dla Zabbix 2.2 tutaj.

Łączny

Po zaimportowaniu szablonu do Zabbix i utworzeniu konta z niezbędnymi uprawnieniami pozostanie nam jedynie skopiowanie skryptów na serwery plików, które chcemy monitorować pod kątem DFSR, dodanie na nich dwóch linii do konfiguracji agenta i zrestartowanie usługi agenta Zabbix , ustawiając je tak, aby działało jako żądane konto. Do monitorowania DFSR nie są wymagane żadne inne ręczne ustawienia.

Źródło: www.habr.com

Dodaj komentarz