Jednoduché monitorování DFS Replication v Zabbix

Úvod

Při dostatečně velké a rozptýlené infrastruktuře, která používá DFS jako jediný přístupový bod k datům a DFSR pro replikaci dat mezi datovými centry a pobočkovými servery, se vynořuje otázka monitorování stavu této replikace.
Tak se stalo, že téměř hned po zahájení používání DFSR jsme začali implementovat Zabbix s cílem nahradit stávající směsici různých nástrojů a přivést monitorování infrastruktury k informativnějšímu, úplnému a logičtějšímu stavu. O využití Zabbixu pro sledování replikace DFS bude řeč.

Nejprve se musíme rozhodnout, jaká data o replikaci DFS potřebujeme shromažďovat pro kontrolu jejího stavu. Nejaktuálnějším ukazatelem je backlog. Ten zahrnuje soubory, které nebyly synchronizovány s ostatními členy replikace. Jeho velikost lze zjistit pomocí nástroje dfsrdiag, který se instaluje spolu s rolí DFSR. V normálním stavu replikace by velikost backlog měla směřovat k nule. Naopak, vysoké hodnoty počtu souborů v backlogu svědčí o problémech s replikací.

Teď se podíváme na praktickou stránku věci.

Abychom mohli monitorovat velikost backlogu přes Zabbix Agent, budeme potřebovat:

  • Skript, který bude analyzovat výstup dfsrdiag pro poskytování konečných hodnot velikosti backlogu do Zabbixu,
  • Skript, který určí, kolik replikovaných skupin je na serveru, jaké složky replikují a které další servery do nich patří (nechceme přece zadávat všechna tato data do Zabbixu ručně pro každý server, že?),
  • Zahrnutí těchto skriptů jako UserParameter do konfigurace agenta Zabbix pro následné volání z monitorovacího serveru,
  • Spuštění Zabbix agenta pod uživatelským jménem, které má práva číst backlog,
  • Šablona pro Zabbix, ve které bude nastavena detekce skupin, zpracování přijatých dat a vydávání upozornění na ně.

Skript pro analýzu

Pro napsání parseru jsem zvolil VBS jako nejuniverzálnější jazyk, který je přítomen ve všech verzích Windows Server. Logika skriptu je jednoduchá: přijímá přes příkazový řádek název replikované skupiny, složky a názvy odesílajících a přijímajících serverů. Tyto parametry jsou následně předávány do dfsrdiag, a na základě jejího výstupu je vyhodnoceno:
Počet souborů – pokud bylo obdrženo oznámení o přítomnosti souborů v backlogu,
0 — pokud jste obdrželi zprávu o absenci souborů v backlogu („No Backlog“),
-1 — pokud jste obdrželi zprávu o chybě dfsrdiag při provádění požadavku ("[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

Skript pro detekci

Aby Zabbix sám určoval všechny skupiny replikace přítomné na serveru a aby zároveň zjistil všechny potřebné parametry pro požadavek (název složky, názvy sousedních serverů), musíme tyto informace jednak získat, a jednak je představit ve formátu, který Zabbix rozumí. Formát, který chápe nástroj rozpoznávání, vypadá takto:

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

...

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

Potřebné informace získáme nejlépe přes WMI, vytažením z příslušných sekcí DfsrReplicationGroupConfig. Výsledkem je skript, který vytváří dotaz k WMI a na výstupu poskytuje seznam skupin, jejich složek a serverů v požadovaném formátu.

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

Souhlasím, skript možná nezáří elegance kódu a něco v něm určitě lze zjednodušit, ale jeho hlavní funkci — poskytovat informace o parametrech skupin replikace ve formátu srozumitelném pro Zabbix — plní úspěšně.

Přidání skriptů do konfigurace agenta Zabbix

Zde je to naprosto jednoduché. Na konci konfiguračního souboru agenta přidáme řádky:

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"

Cesty samozřejmě upravíme na ty, kde máme skripty. Dal jsem je do té samé složky, kam je nainstalován agent.

Po provedení změn restartujeme službu agenta Zabbix.

Změna uživatele, pod kterým běží služba Zabbix Agent

Abychom mohli získávat informace prostřednictvím dfsrdiag, je nutné spustit nástroj pod uživatelským účtem, který má administrativní práva jak na sending, tak na receiving členech skupiny replikace. Služba agenta Zabbix, spuštěná ve výchozím nastavení pod systémovým účtem, tento požadavek nemůže splnit. Vytvořil jsem samostatný účet v doméně, dal mu administrativní práva na požadovaných serverech a na těchto serverech jsem nastavil spuštění služby pod ním.

Můžeme jít také jinou cestou: protože dfsrdiag, v podstatě funguje přes stejný WMI, můžeme využít popis, jak přidělit doménovému uživatelskému účtu práva na jeho použití bez udělení administrativních práv, ale pokud máme mnoho skupin replikace, bude obtížné přidělovat práva na každou skupinu. Nicméně pokud budeme chtít monitorovat replikaci Domain System Volume na doménových kontrolerech, může to být jediná přijatelná varianta, protože udělování práva doménového administrátora účtu monitorovací služby není nejlepší nápad.

Šablona monitorování

Na základě získaných údajů jsem vytvořil šablonu, která:

  • Jednou za hodinu spouští automatické zjištění skupin replikace,
  • Každých 5 minut kontroluje velikost backlogu pro každou skupinu,
  • Obsahuje spouštěč, který generuje upozornění, pokud je velikost backlogu pro nějakou skupinu větší než 100 po dobu 30 minut. Spouštěč je popsán jako prototyp, který se automaticky přidává k zjištěným skupinám,
  • Vytváří grafy velikosti backlogu pro každou skupinu replikace.

Šablonu pro Zabbix 2.2 lze stáhnout zde.

Výsledek

Po importu šablony do Zabbixu a vytvoření účtu s potřebnými právy, stačí pouze zkopírovat skripty na souborové servery, které chceme monitorovat ohledně DFSR, přidat dvě řádky do konfigurace agenta na nich a restartovat službu agenta Zabbix, nastavujíc její spuštění pod potřebným účtem. Nepotřebujeme žádná další manuální nastavení pro monitorování DFSR.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster