Exchange, Grupos de Almacenamiento y algo de scripting


Hace algún tiempo, un servidor MS Exchange me estuvo dando muchos problemas porque los grupos de almacenamiento estaban ocupando gran parte del disco. Después de varios intentos para reducir los grupos de almacenamiento, opté por instalar un SAN para que los alojara y que los servidores Exchange atacaran a los volúmenes de la SAN. Por cierto, los servidores Exchange atacan a la SAN con iSCSI y es un gran invento! iSCSI hace que parezcan unidades locales del servidor, pero realmente se está atacando sobre IP al SAN. El único problema es que las tarjetas de red de los clientes de la SAN deben implementar iSCSI por hardware, o se nota un rendimiento muy bajo …

Después de la migración para mover los grupos a la SAN (que por cierto fue muy limpia: backup, comprobación del backup y bonito asistente de migración) el problema fué que cuando habían cortes de red o por algún motivo había que reiniciar algún servidor Exchange, si al arrancar el server no estaba arrancado y listo el SAN, los grupos de almacenamiento se quedaban desmontados forever and ever, rechazando el correo entrante. 

… Mmmmm …

Houston: we have a problem!

Así que, ya que andaba implementando un sistema de monitorización, me puse a codificar un script en WSHost/VBScript para que comprobara el estado de los grupos de almacenamiento y que si encontrara uno desmontado, lo montara y devolviera un entero en función del estado de los grupos. Pero siguiendo con mi filosofía: el sistema de monitorización debe alertar al administrador, pero las primeras tareas para arreglar el fallo deben ser automáticas, así me ahorro tener que hacer operaciones repetitivas y si se requiere intervención será porque la incidencia realmente así lo requiere. El script está pensado para ser integrado con Zabbix: el agente de Zabbix ejecuta el script que arreglará lo que encuentre y si ha tenido que arreglar algo devuelve 1, sino un 0. Así podemos graficar desde Zabbix cuándo han habido problemas relativos a los grupos de almacenamiento.

No me enrollo más, el script que comprueba el estado de los grupos de almacenamiento y los monta si no lo estaban es esto:


'**************************************************************************
' Author: quimicefa@gmail.com
'**************************************************************************

Option Explicit

Sub e (str)
wscript.echo str
End Sub

Function sStoreStatus (iType)
If iType = 0 Then
sStoreStatus = "Store is online (0)"
ElseIf iType = 1 Then
sStoreStatus = "Store is offline (1)"
ElseIf iType = 2 Then
sStoreStatus = "Store is mounting (2)"
ElseIf iType = 3 Then
sStoreStatus = "Store is dismounting (3)"
Else
sStoreStatus = "Unknown (" & iType & ")"
End If
End Function

Function bStorageStatus (iType)
If iType 0 Then
bStorageStatus = True
Else
bStorageStatus = False
End If
End Function

' Main
Dim iExs ' as CDOEXM.ExchangeServer
Dim isg ' as CDOEXM.StorageGroup
Dim ipsDB ' as CDOEXM.PublicStoreDB
Dim imbxDB ' as CDOEXM.MailBoxStoreDB

Dim strServerName ' as String
Dim storegroup ' as Variant (string)
Dim pubstore ' as Variant (string)
Dim mbx ' as Variant (string)
Dim objSysInfo ' as Object

' nº de grupos de almacenamiento que fallan (con estado distinto de 0)
Dim nFailedStorages
nFailedStorages = 0

Set objSysInfo = CreateObject ("WinNTSystemInfo")
strServerName = objSysInfo.ComputerName
Set objSysInfo = Nothing
Set iExs = CreateObject ("CDOEXM.ExchangeServer")
Set isg = CreateObject ("CDOEXM.StorageGroup")
Set ipsDB = CreateObject ("CDOEXM.PublicStoreDB")
Set imbxDB = CreateObject ("CDOEXM.MailboxStoreDB")
iExs.DataSource.Open strServerName

For Each storegroup In iExs.StorageGroups
isg.DataSource.Open storegroup
For Each pubstore In isg.PublicStoreDBs
ipsDB.DataSource.Open pubstore
If bStorageStatus(ipsDB.Status) Then
nFailedStorages = 1
End If
If ipsDB.Status = 1 Then ' el grupo est· desmontado
ipsDB.Mount
End If
Next ' for each public store
For Each mbx In isg.MailboxStoreDBs
imbxDB.DataSource.Open mbx
If bStorageStatus(imbxDB.Status) Then
nFailedStorages = 1
End If
If imbxDB.Status = 1 Then 'el grupo est· desmontado
imbxDB.Mount
End If
Next ' for each mailbox store
Next 'storage group

 

Set iExs = Nothing
Set isg = Nothing
Set ipsDB = Nothing
Set imbxDB = Nothing
Wscript.Stdout.Write nFailedStorages
Wscript.quit

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: