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ć
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
Łą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