Просты маніторынг 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. Логіка працы скрыпту простая: ён атрымлівае праз камандны радок імя групы рэплікацыі, якая рэплікуецца тэчкі, і імёны sending і receiving сервераў. Далей гэтыя параметры перадаюцца ў 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 фармаце. Фармат, які разумее прыладу discovery, выглядае так:

        "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, утыліту трэба запускаць ад імя ўліковага запісу, які мае адміністрацыйныя правы як на sending, так і на receiving членах групы рэплікацыі. Служба агента Zabbix, запушчаная па змаўчанні пад сістэмным уліковым запісам, такі запыт выканаць не зможа. Я стварыў асобны ўліковы запіс у дамене, даў ёй адміністрацыйныя правы на патрэбных серверах і наладзіў на гэтых серверах запуск службы з-пад яе.

Можна пайсці і іншым шляхам: паколькі dfsrdiag, па сутнасці, працуе праз той жа WMI, то можна скарыстацца апісаннем, як даць даменнага ўліковага запісу права на яго выкарыстанне без выдачы адміністрацыйных правоў, але калі ў нас шмат груп рэплікацыі, то выдаваць правы на кожную групу будзе цяжка. Аднак у выпадку, калі мы захочам маніторыць рэплікацыю Domain System Volume на кантролерах дамена, гэта можа апынуцца адзіным прымальным варыянтам, паколькі даваць правы адміністратара дамена ўліку службы маніторынгу – не самая лепшая ідэя.

Шаблон маніторынгу

Грунтуючыся на атрыманых дадзеных, я стварыў шаблон, які:

  • Раз у гадзіну запускае аўтаматычнае выяўленне груп рэплікацыі,
  • Раз у 5 хвілін правярае памер backlog для кожнай групы,
  • Змяшчае трыгер, які выдае алерт пры памеры backlog для якой-небудзь групы больш за 100 на працягу 30 хвілін. Трыгер апісаны як прататып, які аўтаматычна дадаецца да выяўленых груп,
  • Будуе графікі памеру backlog для кожнай групы рэплікацыі.

Спампаваць шаблон для Zabbix 2.2 можна тут.

Вынік

Пасля імпарту шаблону ў Zabbix і стварэння ўліковага запісу з патрэбнымі правамі, нам будзе дастаткова толькі скапіяваць скрыпты на файлавыя серверы, якія мы жадаем маніторыць па частцы DFSR, дадаць два радка ў канфігурацыю агента на іх і перазапусціць службу агента Zabbix, наладзіўшы яе запуск ад імя патрэбнага ўліковага запісу. Ніякіх іншых ручных налад для маніторынгу DFSR не запатрабуецца.

Крыніца: habr.com

Дадаць каментар