Monitoreo simple de DFS Replication en Zabbix

Introducción

Con una infraestructura suficientemente grande y distribuida que utiliza DFS como un único punto de acceso a los datos y DFSR para la replicación de datos entre el centro de datos y los servidores de sucursales, surge la cuestión del monitoreo del estado de esta replicación.
Casualmente, justo después de comenzar a utilizar DFSR, comenzamos a implementar Zabbix con el objetivo de reemplazar la variedad de herramientas existentes y llevar el monitoreo de la infraestructura a un estado más informativo, completo y lógico. De esto tratará el uso de Zabbix para supervisar la replicación de DFS.

Primero, necesitamos definir qué datos sobre la replicación de DFS necesitamos recopilar para controlar su estado. El indicador más relevante es el backlog. Este incluye archivos que no han sido sincronizados con otros miembros del grupo de replicación. Su tamaño se puede revisar con la utilidad dfsrdiag, que se instala junto con el rol de DFSR. En un estado normal de replicación, el tamaño del backlog debería tender a cero. Por consiguiente, valores altos en la cantidad de archivos en el backlog indican problemas con la replicación.

Ahora, pasemos a la parte práctica del asunto.

Para monitorear el tamaño del backlog a través de Zabbix Agent, necesitaremos:

  • Un script que analizará la salida dfsrdiag para proporcionar en Zabbix los valores finales del tamaño del backlog,
  • Un script que determinará cuántos grupos de replicación hay en el servidor, qué carpetas están replicando y qué otros servidores están involucrados (no queremos ingresar todo esto en Zabbix manualmente para cada servidor, ¿verdad?),
  • Incorporar estos scripts como UserParameter en la configuración del agente Zabbix para una posterior llamada desde el servidor de monitoreo,
  • Ejecutar el servicio del agente Zabbix bajo el nombre de un usuario que tenga permisos para leer el backlog,
  • Una plantilla para Zabbix, en la que se configurará la detección de grupos, el procesamiento de los datos recibidos y la emisión de alertas sobre ellos.

Script de análisis

Para escribir el analizador, elegí VBS como el lenguaje más universal, presente en todas las versiones de Windows Server. La lógica de funcionamiento del script es sencilla: recibe a través de la línea de comando el nombre del grupo de replicación, la carpeta replicada y los nombres de los servidores de envío y recepción. Luego, estos parámetros se pasan a dfsrdiag, y dependiendo de su salida se emitirá:
El número de archivos — si se recibe un mensaje sobre la existencia de archivos en el backlog,
0 — si se recibe un mensaje de que no hay archivos en el backlog («No Backlog»),
-1 — si se recibe un mensaje de error dfsrdiag al realizar la solicitud ("[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

Script de detección

Para que Zabbix detecte todas las grupos de replicación presentes en el servidor y determine todos los parámetros necesarios para la solicitud (nombre de la carpeta, nombres de servidores vecinos), necesitamos obtener esta información y presentarla en un formato comprensible para Zabbix. El formato que entiende la herramienta de descubrimiento es el siguiente:

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

...

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

La información que nos interesa es más fácil de obtener a través de WMI, extrayéndola de las secciones correspondientes de DfsrReplicationGroupConfig. Así nació un script que forma una solicitud a WMI y produce una lista de grupos, sus carpetas y servidores en el formato requerido.

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

Estoy de acuerdo, el script puede que no sea el más elegante en cuanto a código y seguro que se puede simplificar algo, pero cumple con su función principal: proporcionar información sobre los parámetros de los grupos de replicación en un formato comprensible para Zabbix.

Incorporación de scripts en la configuración del agente Zabbix

Aquí es todo bastante simple. Añadimos las siguientes líneas al final del archivo de configuración del agente:

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"

Por supuesto, ajustamos las rutas a donde tenemos los scripts. Yo los coloqué en la misma carpeta donde está instalado el agente.

Después de realizar los cambios, reiniciamos el servicio del agente Zabbix.

Cambio del usuario con el que funciona el servicio del Agente Zabbix

Para poder recibir información a través de dfsrdiag, la herramienta debe ejecutarse con una cuenta que tenga privilegios administrativos tanto en los miembros del grupo de replicación de envío como de recepción. El servicio del agente de Zabbix, que se ejecuta por defecto con una cuenta del sistema, no podrá realizar esa solicitud. Creé una cuenta separada en el dominio, le otorgué privilegios administrativos en los servidores necesarios y configuré el inicio del servicio desde esa cuenta en esos servidores.

Se puede optar por otro enfoque: dado que dfsrdiag, en esencia, funciona a través del mismo WMI, se puede aprovechar la descripción, sobre cómo otorgar a una cuenta de dominio permisos para su uso sin otorgar derechos administrativos, pero si tenemos muchos grupos de replicación, otorgar derechos a cada grupo puede resultar complicado. Sin embargo, si queremos supervisar la replicación del Domain System Volume en los controladores de dominio, esto podría ser la única opción viable, ya que otorgar derechos de administrador del dominio a la cuenta del servicio de monitoreo no es la mejor idea.

Plantilla de monitoreo

Basado en la información obtenida, creé una plantilla que:

  • Ejecuta automáticamente la detección de grupos de replicación cada hora,
  • Verifica cada 5 minutos el tamaño del backlog para cada grupo,
  • Contiene un disparador que emite una alerta si el tamaño del backlog para algún grupo supera 100 durante 30 minutos. El disparador se describe como un prototipo que se añade automáticamente a los grupos detectados,
  • Construye gráficos del tamaño del backlog para cada grupo de replicación.

Puedes descargar la plantilla para Zabbix 2.2 aquí.

Summary

Después de importar la plantilla en Zabbix y crear una cuenta con los permisos necesarios, solo será suficiente copiar los scripts en los servidores de archivos que queremos monitorear en relación a DFSR, agregar dos líneas a la configuración del agente en ellos y reiniciar el servicio del agente de Zabbix, configurándolo para que se ejecute con la cuenta requerida. No se necesitarán otras configuraciones manuales para monitorear DFSR.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster