Em ambientes de Cluster com HYPER-V como monitorizar o interface de rede utilizado por uma VM:
Por vezes surge a necessidade configurar o Cluster para fazer failover das VM´s de um node para o outro case falhe o interface pelo qual a VM comunica.
Em circunstancias normais o cluster apenas monitoriza os recursos de Virtual Machine / Virtual Machine Configuration / Disco Fisico.
Workaround:
One approach to workaround this, is to add a cluster resource script to the Cluster Group. Below is a script, with short instructions.
Please note, this is a sample script, so you should consider testing and modifications to adjust for your own needs.
Unfortunately, this approach is not applicable if you manage your cluster with SCVMM 2008, as it will mark your VM as "unsupported"
This "unsupported cluster configuration" notice in SCVMM will go away with SCVMM 2008 R2, and a April updated to SCVMM 2008
copy and paste the below and save as NicHa.vbs
' 1. copy this script to all cluster nodes into %windir%\cluster
' 2. In Failover Cluster Management Select the VM you wish to add NIC Monitoring
' 3. Select "Add a resource" -> Generic Script
' 4. Enter %windir%\cluster\nicha.vbs
' 5. Next, Finish. Note the name of the created resource (nicha Script)
' 6. Run ncpa.cpl
' 7. Identfiy the Phyiscl NIC that is used by the Switch for this VM (This NIC should only have the Switch Protocol bound)
' Usually something like "Local Area Connection"
' 8. Rename this NIC to something like "VM Network 1"
' 9. Do steps 6 to 8 on all cluster nodes
' 10. Open a Elevated CMD Prompt
' 11. Using the names from above, "nicha script", "VM Network 1"'
' 12. In cmd prompt, issue the following command: cluster res "nicha Script" /priv NicName="VM Network 1"
' 13. Online the Script Resource
'You may edit the properties of the Virtual Machine Group in Failover Cluster Management to allow more failovers in a given period.
'The Default of 2 may be reached easily during testing. The script resource will then fail, but the group will not move
'The availability of the NIC is checked every minute by default.
'This could be changed in the Advanced Properties of the Script Resource in the "Thorough resource health check interval", if needed
'
'*******************************************************************************************************************************************************
'*******************************************************************************************************************************************************
'*******************************************************************************************************************************************************
'Global variables
'*******************************************************************************************************************************************************
'Script Version
ScriptVersion = "0.2"
'*******************************************************************************************************************************************************
'Open()
'
'*******************************************************************************************************************************************************
Function Open()
On Error Resume Next
Resource.LogInformation("Entering Open() for NIC Monitoring Generic Script Version " & ScriptVersion)
If Resource.PropertyExists("NicName") = FALSE Then
Resource.AddProperty("NicName")
Resource.LogInformation("NICHA: Property NicName not configured")
End If
Open = 0
End Function
'*******************************************************************************************************************************************************
'Online()
'
'*******************************************************************************************************************************************************
Function Online()
'Check if the NIC is connected, otherwise fail Open
Online = 1
strComputer = "."
strNicName = Resource.NicName
strquery = "Select * from Win32_NetworkAdapter where NetConnectionID = '" & strNicName & "'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery(strquery)
if colItems.Count = 0 then
Resource.LogInformation("NICHA: Error - NIC not found")
set objWMIService = nothing
Set colItems = nothing
Exit Function
end if
set objItem = colItems.ItemIndex(0)
if objItem.NetConnectionStatus = 2 then
Online = 0
else
Resource.LogInformation("NICHA: Error - NIC not in connected state")
end if
set objWMIService = nothing
Set colItems = nothing
set objItem = nothing
End Function
'*******************************************************************************************************************************************************
'LooksAlive()
'
'Return success
'*******************************************************************************************************************************************************
Function LooksAlive()
On Error Resume Next
LooksAlive = TRUE
End Function
'*******************************************************************************************************************************************************
'IsAlive()
'
'*******************************************************************************************************************************************************
Function IsAlive()
On Error Resume Next
IsAlive = FALSE
strComputer = "."
strNicName = Resource.NicName
strquery = "Select * from Win32_NetworkAdapter where NetConnectionID = '" & strNicName & "'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery(strquery)
if colItems.Count = 0 then
Resource.LogInformation("NICHA: Error - NIC not found")
set objWMIService = nothing
Set colItems = nothing
Exit Function
end if
set objItem = colItems.ItemIndex(0)
if objItem.NetConnectionStatus = 2 then
IsAlive = TRUE
else
Resource.LogInformation("NICHA: Error - NIC not in connected state")
end if
set objWMIService = nothing
Set colItems = nothing
set objItem = nothing
End Function
'*******************************************************************************************************************************************************
'Offline()
'
'*******************************************************************************************************************************************************
Function Offline()
On Error Resume Next
Offline = 0
End Function
'*******************************************************************************************************************************************************
'Terminate()
'
'*******************************************************************************************************************************************************
Function Terminate()
On Error Resume Next
Terminate = 0
End Function
'*******************************************************************************************************************************************************
'Close()
'
'Return success
'*******************************************************************************************************************************************************
Function Close()
Close = 0
End Function