It’s important to keep our Hyper-V cluster hosts and the virtual machines running on them up to date. Whilst we have great and free solutions to achieve this there are some things missing like centralized reporting on the Integration Services component version running on all of the nodes in a cluster and way to upgrade all the virtual machines to version running on the host. This post deals with the first issue.
Before we upgrade the Integration Services components on the virtual machines we always check if all nodes in the cluster are on the same version themselves. Sure this should not happen if you mange them right but my world isn’t perfect. So trust but verify.With cluster sizes now up to 64 nodes it’s ever more important to keep an eye on them. But even for smaller cluster the task of determining the Integration Services components manually via the GUI, event viewer and/or registry is rather tedious. Out of sync Integration Services components can be troublesome and cause many issues and if you have out of sync virtual machines, imagine the extra mess you’ll be in when even the cluster nodes are running different versions.
To make live easier I threw a little PowerShell script together to check the host Integration Services component version on all nodes of a Window Server 2012 Hyper-V Cluster With PowerShell. I’m far from a PowerShell guru, but you’ll see that you can do a lot of things done even if you’re not. I’m sharing it here for you to use, adapt for your own needs and get some inspiration. It basically allows you to optionally pass an expected version of the IS components and a cluster name like this
CheckHyperVClusterHostsICVersion -Version 6.2.9200.16433 -cluster "MyClusterName"
It does the following:
- It will list per Integration Services component version found on cluster nodes what version was found on what nodes. This gives you a nice overview. I hope this never becomes to much of a list in your clusters.
- If you don’t specify a cluster it will try to connect to the cluster to which the host you’re running on belongs, if any.
- If the host does not belong to a cluster it will just provide feedback on the IS version of that Hyper-V host you’re running the script on.
Here’s a screen shot of when you run this on a none clustered host, without Hyper-V installed:
This is the result of running it against a well maintained cluster without any parameters that has been updated with KB2770917:
The same but now with the expected version and cluster name passed as parameters
So, there you go, I hope you find it useful.
#===========================================================
# # Microsoft PowerShell Source File
#
# NAME: CheckISCOnNodesOfHyperVCluster.ps1
# VERSION: 1.0.0.0
# AUTHOR: Didier Van Hoye
# DATE : 17/11/2012
#
# COMMENT: This script is intended to be run
# against Windows Server 2012 and assumes
# the use of PowerShell 3.0
# The parameters are optional but if you
# leave out some the remainder should be named.
# # =======================================================
cls
$ErrorActionPreference = "Stop"
function CheckHyperVClusterHostsICVersion
{
Param
(
#Param help description
[Version]
$ExpectedISCVersion,
#Param help description
[String]
$Cluster
)
Write-Host "This script will check the IS components on all nodes of a cluster." -ForegroundColor Green
If ($ExpectedISCVersion) {Write-Host "You specified the expected IS component version to be $ExpectedISCVersion" -ForegroundColor Green}
Else {Write-host "You did not specify an expected IS component version." -ForegroundColor Green}
If ($Cluster)
{
Try
{
$ClusterObject= Get-Cluster -Name $Cluster
}
Catch
{
Write-Host "We cannot contact the cluster you specified"
}
}
Else
{
write-Host "`n`n"
Write-host "You did not specify a cluster to connect to. We'll use the cluster to which the node this script is running on belongs if any." -ForegroundColor Yellow
write-Host "`n`n"
Try
{
$ClusterObject = Get-Cluster
}
Catch
{
$LocalHost = $env:computername
Write-Host
Write-Host "The current node ($LocalHost) is not a member of a cluster. As a courtsey to you we'll check the IS components for current host" -foregroundcolor Magenta
Write-Host
}
}
If ($ClusterObject) {$ToCheck= "the nodes of cluster $ClusterObject"} Else { $ToCheck = "server $env:computername"}
write-Host "Attempting to running Integration Components version check on" $ToCheck -ForegroundColor Green
Write-Host
If ($ClusterObject)
{
$ClusterNodes = Get-Clusternode -cluster $ClusterObject.Name
#Declare an hashtable to hold all host/IS version values. The hosts are the key here.
$HostISVersions = @{}
foreach ($ClusterNode in $ClusterNodes)
{
Try
{
$HostISVersions[$ClusterNode.Name]=Get-ItemProperty "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionVirtualizationGuestInstallerVersion" | select -ExpandProperty Microsoft-Hyper-V-Guest-Installer
}
Catch
{
Write-Host "We could not determine the version of the Integration Services on this host, probably due to this not being a Hyper-V host" -ForegroundColor Orange
Write-Host "We'll check this for you right now" -ForegroundColor Orange
$HyperVFeature = Get-WindowsFeature Hyper-V
If ($HyperVFeature.Installstate -eq "Installed")
{
Write-Host "Hyper-V seems to be installed on this node. Something else is wrong." -ForegroundColor Red
}
Else
{
Write-Host "Hyper-V is indeed not installed on this node." -ForegroundColor Orange
}
}
}
#Use GetEnumerator or thise sorting thing doesn't work out well on an hash tabel :-)
$UniqueIcVersions = $HostISVersions.GetEnumerator() | Sort-Object -Property Value -Unique
Write-Host "We've found " $UniqueIcVersions.count "versions on the" $HostISVersions.count "nodes of your cluster" $ClusterObject.Name
ForEach ($IcVersion in $UniqueIcVersions )
{
$Counter = 1
$IcVersionValue = $IcVersion.value
"IC version " + $IcVersion.value + " is found in:"
foreach ($Key in ($HostISVersions.GetEnumerator()| Where-Object { $_.value -eq $IcVersionValue}))
{
"`t" + "$Counter : " + $Key.Name
$Counter= $Counter + 1
}
If ($ExpectedISCVersion)
{
$CompareVersions = ([Version]$IcVersion.Value).CompareTo([Version]$ExpectedISCVersion)
switch ($CompareVersions)
{
0 {Write-Host "This version ($IcVersionValue) is equal to the expected version ($ExpectedISCVersion)." -ForegroundColor Green}
1 {Write-Host "This version ($IcVersionValue) is higher than the expected version ($ExpectedISCVersion). Please ensure all hosts run the same IC version level." -ForegroundColor Yellow}
-1 {Write-Host "This version ($IcVersionValue) is lower than the expected version ($ExpectedISCVersion). Please ensure all hosts run the same IC version level." -ForegroundColor Red}
}
}
}
}
Else
{
Try
{
$HostIcVersion = Get-ItemProperty "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionVirtualizationGuestInstallerVersion" | select -ExpandProperty Microsoft-Hyper-V-Guest-Installer
Write-Host "The IS component version on server $localhost is $HostIcVersion"
If ($ExpectedISCVersion)
{
$CompareVersions = ([Version]$HostIcVersion).CompareTo([Version]$ExpectedISCVersion)
switch ($CompareVersions)
{
0 {Write-Host "This version ($HostIcVersion) is equal to the expected version ($ExpectedISCVersion)." -ForegroundColor Green}
1 {Write-Host "This version ($HostIcVersion) is higher than the expected version ($ExpectedISCVersion). Please check if you need to downgrade your host or if the expected version is correct." -ForegroundColor Yellow}
-1 {Write-Host "This version ($HostIcVersion) is lower than the expected version ($ExpectedISCVersion). Please check if you need to upgrade your host or if the expected version is correct." -ForegroundColor Red}
}
}
}
Catch
{
Write-Host "We could not determine the version of the Integration Services on this host, probably due to this not being a Hyper-V host" -ForegroundColor yellow
Write-Host "We'll check this for you right now" -ForegroundColor yellow
$HyperVFeature = Get-WindowsFeature Hyper-V
If ($HyperVFeature.Installstate -eq "Installed")
{
Write-Host "Hyper-V seems to be installed on this node. Something else is wrong." -ForegroundColor Red
}
Else
{
Write-Host "Hyper-V is indeed not installed on this node." -ForegroundColor yellow
}
}
}
}
CheckHyperVClusterHostsICVersion -Version 6.2.9200.16433 -cluster "MyClusterName"