Прост мониторинг на DFS Replication в Zabbix

Въведение

При достатъчно голяма и разпределена инфраструктура, използваща DFS като единствена точка за достъп до данни и DFSR за репликация на данни между ЦОД и сървърите на филиалите, възниква въпросът за мониторинг на състоянието на тази репликация.
Случи се така, че почти веднага след започването на използването на DFSR, започнахме внедряването на Zabbix с цел да заменим съществуващия зоопарк от различни инструменти и да приведем мониторинга на инфраструктурата в по-информативен, пълен и логичен вид. Темата на използването на Zabbix за наблюдение на репликацията на DFS ще бъде разгледана.

Първо, трябва да определим какви данни за репликацията на DFS трябва да получаваме, за да контролираме нейното състояние. Най-актуалният индикатор е backlog. В него попадат файлове, които не са били синхронизирани с другите членове на репликационната група. Размерът му може да се види с помощта на утилитата dfsrdiag, която се инсталира заедно с ролята на DFSR. В нормални условия на репликация размерът на backlog трябва да стреми към нула. Следователно, големи стойности на броя файлове в backlog показват проблеми с репликацията.

Сега относно практическата страна на въпроса.

За да мониторим размера на backlog чрез Zabbix Agent, ще ни трябват:

  • Скрипт, който ще парсва изхода dfsrdiag за предоставяне в Zabbix на окончателни стойности за размера на backlog,
  • Скрипт, който ще определя колко репликационни групи има на сървера, какви папки репликират и какви още сървъри участват в тях (не искаме да въвеждаме всичко това в Zabbix ръчно за всеки сървър, нали?),
  • Включването на тези скриптове като UserParameter в конфигурацията на агента Zabbix за последващо извикване от сървъра за мониторинг,
  • Стартиране на услугата на агента Zabbix от име на потребител, който има права да чете backlog,
  • Шаблон за Zabbix, в който ще бъде настроено откритие на групите, обработка на получените данни и издаване на аларми по тях.

Парсер скрипт

За написването на парсера избрах VBS като най-универсален език, присъстващ във всички версии на Windows Server. Логиката на работа на скрипта е проста: той получава през командния ред името на репликационната група, репликираната папка и имената на изпращащия и получаващия сървър. След това тези параметри се предават в dfsrdiag, и в зависимост от нейния изход се издава:
Броят на файловете — ако е получено съобщение за наличие на файлове в backlog,
0 — ако получиш съобщение за липсващи файлове в backlog („No Backlog“),
-1 — ако получиш съобщение за грешка dfsrdiag при изпълнение на заявка ("[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

Скрипт за откриване

За да може Zabbix сам да определи всички групи за репликация, присъстващи на сървъра, и сам да установи всички необходими за заявка параметри (име на папка, имена на съседни сървъри), трябва първо да получим тази информация и след това да я представим в разбираем за Zabbix формат. Форматът, разбран от инструмента за откриване, изглежда така:

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

...

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

Най-лесно можем да получим необходимата информация чрез WMI, извличайки я от съответните раздели DfsrReplicationGroupConfig. В крайна сметка се създаде скрипт, който изгражда заявка към WMI и на изхода дава списък на групите, техните папки и сървъри в необходимия формат.

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

Съгласен, скриптът, вероятно, не е блестящ с елегантността на кода и нещо в него определено може да се опрости, но основната му функция — да предоставя информация за параметрите на групите за репликация в формат, понятен на Zabbix — я изпълнява успешно.

Включване на скриптове в конфигурацията на агента Zabbix

Тук всичко е пределно просто. Към края на файла с конфигурацията на агента добавяме редовете:

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"

Пътищата, разбира се, коригираме на тези, където се намират скриптовете. Поставих ги в същата папка, където е инсталиран агентът.

След направените промени рестартираме услугата на агента Zabbix.

Промяна на потребителя, от когото работи услугата Zabbix Agent

За да получавате информация чрез dfsrdiag, инструментът трябва да се стартира от името на сметка с администраторски права, както на групите по изпращане, така и на групите по получаване на репликация. Агентската услуга на Zabbix, стартирана по подразбиране под системната сметка, не може да изпълни тази заявка. Създадох отделна сметка в домейна, предоставих ѝ администраторски права на необходимите сървъри и конфигурирах да се стартира услугата от нея на тези сървъри.

Може да се поеме и по друг път: тъй като dfsrdiag, по същество, работи чрез същия WMI, може да се използва описание, как да се предоставят права на домейна за използването му без предоставяне на администраторски права, но ако имаме много групи за репликация, предоставянето на права на всяка група би било затруднително. Въпреки това, в случай че искаме да наблюдаваме репликацията на Domain System Volume на контролерите на домейнa, това може да се окаже единствено приемлив вариант, тъй като даването на права на администратор на домейна на сметката на мониторинга не е най-добрата идея.

Шаблон за мониторинг

Въз основа на получените данни, създадох шаблон, който:

  • На всеки час стартира автоматично откритие на групите за репликация,
  • На всеки 5 минути проверява размера на backlog за всяка група,
  • Съдържа тригер, генериращ алерт при размер на backlog за някоя група над 100 в продължение на 30 минути. Тригерът е описан като прототип, който автоматично се добавя към откритите групи,
  • Изгражда графики на размера на backlog за всяка група за репликация.

Шаблонът за Zabbix 2.2 може да се изтегли тук..

Резюме

След импортиране на шаблона в Zabbix и създаване на сметка с необходимите права, ще ни е достатъчно само да копираме скриптовете на файловите сървъри, които искаме да наблюдаваме относно DFSR, да добавим две реда в конфигурацията на агента на тях и да рестартираме службата на агента Zabbix, конфигурирайки я да се стартира от името на необходимата сметка. Няма да са нужни други ръчно настройки за наблюдение на DFSR.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster