Categories
Sponsors
Archive
Blogroll
Badges
Community
|
Posted in Virtual Machine Manager, Windows Powershell, Windows Server | No Comment | 1,593 views | 30/09/2013 15:15
You should run this script on Cluster node. Migrates all VM by shutting down first.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| # Configuration
$DestinationCluster = "cluster.domain.com"
# Get Host and Cluster Information
$Hostname = (Get-VMHost).Name
$SourceCluster = (Get-Cluster $Hostname).Name
# Create VM Array
$VMArray = New-Object System.Collections.ArrayList
$VMArray.Clear();
# Get VMs and Add to VM Array
$VMs = Get-VM | Where {(($_ | Select -Expand HardDrives).Path -like "Disk*") -or (($_ | Select -expand FibreChannelHostBusAdapters) -ne $Null)}
$AddArray = $VMs | % {$VMArray.Add($_.Name)}
# Get All Virtual Machines
$AllVMs = Get-VM
foreach ($VM in $AllVMs)
{
# Get VM and Cluster Information
$VMName = $VM.Name
$HyperVHost = $VM.ComputerName
$VMState = $VM.State
$ClusterGroup = Get-ClusterGroup | where Name -like "*$VMName*"
if ($VMArray.Contains($VMName) -eq $False)
{
# Remove from Cluster Resources
if ($ClusterGroup)
{
Get-ClusterGroup $ClusterGroup.Name -Cluster $SourceCluster | Remove-ClusterGroup -RemoveResources -Force
}
Write-Host " "
Write-Host Working on $VMName ..
# Get Volume and Memory Information
$Volume = ((Get-ClusterSharedVolume -Cluster $DestinationCluster | Select -ExpandProperty SharedVolumeInfo | Select @{label="Name";expression={(($_.FriendlyVolumeName).Split("\"))[-1]}},@{label="FreeSpace";expression={($_ | Select -Expand Partition).FreeSpace}} | Sort FreeSpace -Descending)[0]).Name
$DestinationNode = ((Get-Cluster $DestinationCluster | Get-ClusterNode | Select Name,@{label="FreeMemory";expression={([math]::round(((Get-WmiObject -ComputerName $_.Name -Class Win32_OperatingSystem).FreePhysicalMemory / 1KB), 0))}} | Sort FreeMemory -Descending)[0]).Name
# Stop Virtual Machine
if ($VMState -ne "Off")
{
Stop-VM $VMName -Force
}
# Move Virtual Machine
Move-VM $VMName -ComputerName $HyperVHost -DestinationHost $DestinationNode -IncludeStorage -DestinationStoragePath C:\ClusterStorage\$Volume\$VMName
# Add to Destination Cluster Resources
Add-VMToCluster $VMName -Cluster $DestinationCluster
# Start Virtual Machine
if ($VMState -ne "Off")
{
Start-VM $VMName -ComputerName $DestinationNode
}
Write-Host Done.
}
else
{
Write-Host " "
Write-Host Skipping $VMName ..
}
} |
# Configuration
$DestinationCluster = "cluster.domain.com"
# Get Host and Cluster Information
$Hostname = (Get-VMHost).Name
$SourceCluster = (Get-Cluster $Hostname).Name
# Create VM Array
$VMArray = New-Object System.Collections.ArrayList
$VMArray.Clear();
# Get VMs and Add to VM Array
$VMs = Get-VM | Where {(($_ | Select -Expand HardDrives).Path -like "Disk*") -or (($_ | Select -expand FibreChannelHostBusAdapters) -ne $Null)}
$AddArray = $VMs | % {$VMArray.Add($_.Name)}
# Get All Virtual Machines
$AllVMs = Get-VM
foreach ($VM in $AllVMs)
{
# Get VM and Cluster Information
$VMName = $VM.Name
$HyperVHost = $VM.ComputerName
$VMState = $VM.State
$ClusterGroup = Get-ClusterGroup | where Name -like "*$VMName*"
if ($VMArray.Contains($VMName) -eq $False)
{
# Remove from Cluster Resources
if ($ClusterGroup)
{
Get-ClusterGroup $ClusterGroup.Name -Cluster $SourceCluster | Remove-ClusterGroup -RemoveResources -Force
}
Write-Host " "
Write-Host Working on $VMName ..
# Get Volume and Memory Information
$Volume = ((Get-ClusterSharedVolume -Cluster $DestinationCluster | Select -ExpandProperty SharedVolumeInfo | Select @{label="Name";expression={(($_.FriendlyVolumeName).Split("\"))[-1]}},@{label="FreeSpace";expression={($_ | Select -Expand Partition).FreeSpace}} | Sort FreeSpace -Descending)[0]).Name
$DestinationNode = ((Get-Cluster $DestinationCluster | Get-ClusterNode | Select Name,@{label="FreeMemory";expression={([math]::round(((Get-WmiObject -ComputerName $_.Name -Class Win32_OperatingSystem).FreePhysicalMemory / 1KB), 0))}} | Sort FreeMemory -Descending)[0]).Name
# Stop Virtual Machine
if ($VMState -ne "Off")
{
Stop-VM $VMName -Force
}
# Move Virtual Machine
Move-VM $VMName -ComputerName $HyperVHost -DestinationHost $DestinationNode -IncludeStorage -DestinationStoragePath C:\ClusterStorage\$Volume\$VMName
# Add to Destination Cluster Resources
Add-VMToCluster $VMName -Cluster $DestinationCluster
# Start Virtual Machine
if ($VMState -ne "Off")
{
Start-VM $VMName -ComputerName $DestinationNode
}
Write-Host Done.
}
else
{
Write-Host " "
Write-Host Skipping $VMName ..
}
}
After migration, VM will be started on destination host.
Posted in Windows Powershell, Windows Server | No Comment | 2,011 views | 27/09/2013 15:50
You can get VMs with Passthrough disks and vHBA on Hyper-V Cluster via this PowerShell script:
Get-Cluster | Get-ClusterNode | % {Get-VM -ComputerName $_.Name | Where {(($_ | Select -Expand HardDrives).Path -like "Disk*") -or (($_ | Select -expand FibreChannelHostBusAdapters) -ne $Null)}} |
Get-Cluster | Get-ClusterNode | % {Get-VM -ComputerName $_.Name | Where {(($_ | Select -Expand HardDrives).Path -like "Disk*") -or (($_ | Select -expand FibreChannelHostBusAdapters) -ne $Null)}}
You should run your PowerShell as Administrator.
Posted in Windows Powershell, Windows Server | No Comment | 1,994 views | 27/09/2013 10:11
You can get WWN information from servers like this:
1
2
3
4
5
6
7
| $Servers = "VMHOST01","VMHOST02","VMHOST03","VMHOST04"
Foreach ($Server in $Servers)
{
Write-Host $Server
Invoke-Command -ComputerName $Server -ScriptBlock {&C:\StorageTools\fcinfo\fcinfo}
Write-Host " "
} |
$Servers = "VMHOST01","VMHOST02","VMHOST03","VMHOST04"
Foreach ($Server in $Servers)
{
Write-Host $Server
Invoke-Command -ComputerName $Server -ScriptBlock {&C:\StorageTools\fcinfo\fcinfo}
Write-Host " "
}
You must deploy fcinfo.exe to hosts before you execute this script. You may also use WMI to get WWNs.
Posted in Windows Powershell, Windows Server | 2 Comments | 7,681 views | 24/09/2013 10:47
There are some disk operations you can do in Windows Server 2008 R2 with PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| # Getting Disk Signature
Get-WmiObject Win32_DiskDrive | ft Name, Signature, Index
# Add Disk Signatures into Array
$Signatures = "650992792","650992689"
# Making Them Online
foreach ($Signature in $Signatures)
{
$Disk = Get-WmiObject Win32_DiskDrive | Where {$_.Signature -eq $Signature}
$DiskID = $Disk.index
$DiskPartScript = @"
select disk $DiskID
online disk noerr
"@
$DiskPartScript | diskpart
}
# Making Them Offline
foreach ($Signature in $Signatures)
{
$Disk = Get-WmiObject Win32_DiskDrive | Where {$_.Signature -eq $Signature}
$DiskID = $Disk.index
$DiskPartScript = @"
select disk $DiskID
offline disk noerr
"@
$DiskPartScript | diskpart
} |
# Getting Disk Signature
Get-WmiObject Win32_DiskDrive | ft Name, Signature, Index
# Add Disk Signatures into Array
$Signatures = "650992792","650992689"
# Making Them Online
foreach ($Signature in $Signatures)
{
$Disk = Get-WmiObject Win32_DiskDrive | Where {$_.Signature -eq $Signature}
$DiskID = $Disk.index
$DiskPartScript = @"
select disk $DiskID
online disk noerr
"@
$DiskPartScript | diskpart
}
# Making Them Offline
foreach ($Signature in $Signatures)
{
$Disk = Get-WmiObject Win32_DiskDrive | Where {$_.Signature -eq $Signature}
$DiskID = $Disk.index
$DiskPartScript = @"
select disk $DiskID
offline disk noerr
"@
$DiskPartScript | diskpart
}
Get-Disk is not available in Windows Server 2008 R2, so you should go with WMI.
Posted in Windows Powershell, Windows Server | No Comment | 1,545 views | 24/09/2013 10:31
There are some disk operations you can do in Windows Server 2012 with PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Getting Disk Signature
Get-Disk | ft FriendlyName, Signature
# Add Disk Signatures into Array
$Signatures = "4D53465420202020E55D0891031DB04CB1F2B507ED9FDC88","4D53465420202020E55D0891031DB04CB1F2B507ED9FDC89"
# Making Them Online
foreach ($Signature in $Signatures)
{
Get-Disk | Where {$_.Signature -eq $Signature} | Set-Disk -IsOffline $False
}
# Making Them Offline
foreach ($Signature in $Signatures)
{
Get-Disk | Where {$_.Signature -eq $Signature} | Set-Disk -IsOffline $True
} |
# Getting Disk Signature
Get-Disk | ft FriendlyName, Signature
# Add Disk Signatures into Array
$Signatures = "4D53465420202020E55D0891031DB04CB1F2B507ED9FDC88","4D53465420202020E55D0891031DB04CB1F2B507ED9FDC89"
# Making Them Online
foreach ($Signature in $Signatures)
{
Get-Disk | Where {$_.Signature -eq $Signature} | Set-Disk -IsOffline $False
}
# Making Them Offline
foreach ($Signature in $Signatures)
{
Get-Disk | Where {$_.Signature -eq $Signature} | Set-Disk -IsOffline $True
}
Get-Disk is not available in Windows Server 2008 R2, so you should go with WMI.
Posted in Windows Powershell, Windows Server | No Comment | 1,820 views | 20/09/2013 10:40
This is my cluster checklist script to verify many different components like Windows Updates, Hotfixes, 3Par installation, Driver information etc.
1
2
3
4
5
6
7
8
9
10
| # Lets get our master Cluster Node, thats one of the most updated Cluster Node
$MasterNode = ((Get-Cluster | Get-ClusterNode | Select Name,@{label="HotFixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}} | Sort HotFixes -Descending)[0]).Name
# Get Master Hotfix KBs and put them in a array
$MasterHotfixes = @((Get-Hotfix -ComputerName $MasterNode).HotFixID)
# Now we will use that master hotfixes to compare with others
$ClusterResults = (Get-Cluster | Get-ClusterNode | Select Name,@{label="HP WBEM";expression={$ServerName = $_.Name; $TestWBEM = (Get-Item "\\$ServerName\C$\Program Files\HPWBEM\Tools\HPWbemTestEvent.exe").Exists; if ($TestWBEM -eq $True) { $TestWBEM = "True"; $TestWBEM; } else { $TestWBEM = "False"; $TestWBEM; }}},@{label="3PAR Info";expression={$ServerName = $_.Name; $Test3PAR = (Get-Item "\\$ServerName\C$\Program Files (x86)\3PAR\HP 3PARInfo\HP3PARInfo.exe").Exists; if ($Test3PAR -eq $True) { $Test3PAR = "True"; $Test3PAR; } else { $Test3PAR = "False"; $Test3PAR; }}},@{label="QLogic Driver";expression={$ServerName = $_.Name; (Get-Item \\$ServerName\C$\Windows\System32\Drivers\ql2300.sys).VersionInfo.ProductVersion}},@{label="HP SATA Driver";expression={$ServerName = $_.Name; (Get-Item \\$ServerName\C$\Windows\System32\Drivers\HPCISSs2.sys).VersionInfo.ProductVersion}},@{label="Total Hotfixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}},@{label="Missing Hotfixes";expression={$Hotfixes = @((Get-Hotfix -ComputerName $_.Name).HotFixID); $MissingHotfixes = (Compare-Object -ReferenceObject $MasterHotfixes -DifferenceObject $Hotfixes).InputObject; if ($MissingHotfixes) { $MissingHotfixes } else { $MissingHotfixes = "No missing updates"; $MissingHotfixes } }} | Sort Name)
$ClusterResults |
# Lets get our master Cluster Node, thats one of the most updated Cluster Node
$MasterNode = ((Get-Cluster | Get-ClusterNode | Select Name,@{label="HotFixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}} | Sort HotFixes -Descending)[0]).Name
# Get Master Hotfix KBs and put them in a array
$MasterHotfixes = @((Get-Hotfix -ComputerName $MasterNode).HotFixID)
# Now we will use that master hotfixes to compare with others
$ClusterResults = (Get-Cluster | Get-ClusterNode | Select Name,@{label="HP WBEM";expression={$ServerName = $_.Name; $TestWBEM = (Get-Item "\\$ServerName\C$\Program Files\HPWBEM\Tools\HPWbemTestEvent.exe").Exists; if ($TestWBEM -eq $True) { $TestWBEM = "True"; $TestWBEM; } else { $TestWBEM = "False"; $TestWBEM; }}},@{label="3PAR Info";expression={$ServerName = $_.Name; $Test3PAR = (Get-Item "\\$ServerName\C$\Program Files (x86)\3PAR\HP 3PARInfo\HP3PARInfo.exe").Exists; if ($Test3PAR -eq $True) { $Test3PAR = "True"; $Test3PAR; } else { $Test3PAR = "False"; $Test3PAR; }}},@{label="QLogic Driver";expression={$ServerName = $_.Name; (Get-Item \\$ServerName\C$\Windows\System32\Drivers\ql2300.sys).VersionInfo.ProductVersion}},@{label="HP SATA Driver";expression={$ServerName = $_.Name; (Get-Item \\$ServerName\C$\Windows\System32\Drivers\HPCISSs2.sys).VersionInfo.ProductVersion}},@{label="Total Hotfixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}},@{label="Missing Hotfixes";expression={$Hotfixes = @((Get-Hotfix -ComputerName $_.Name).HotFixID); $MissingHotfixes = (Compare-Object -ReferenceObject $MasterHotfixes -DifferenceObject $Hotfixes).InputObject; if ($MissingHotfixes) { $MissingHotfixes } else { $MissingHotfixes = "No missing updates"; $MissingHotfixes } }} | Sort Name)
$ClusterResults
I hope it also helps you.
Posted in Windows Powershell, Windows Server | No Comment | 1,985 views | 17/09/2013 17:32
This is very useful script to get missing updates from your cluster nodes. Just run this on one of your Cluster node. Make sure you run PowerShell as (Domain) Administrator. Otherwise you can’t query your Cluster.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Yusuf Ozturk, 2013
# http://www.yusufozturk.info
# Lets get our master Cluster Node, thats one of the most updated Cluster Node
$MasterNode = ((Get-Cluster | Get-ClusterNode | Select Name,@{label="HotFixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}} | Sort HotFixes -Descending)[0]).Name
# Get Master Hotfix KBs and put them in a array
$MasterHotfixes = @((Get-Hotfix -ComputerName $MasterNode).HotFixID)
# Now we will use that master hotfixes to compare with others
$HotfixResults = (Get-Cluster | Get-ClusterNode | Select Name,@{label="Total Hotfixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}},@{label="Missing Hotfixes";expression={$Hotfixes = @((Get-Hotfix -ComputerName $_.Name).HotFixID); $MissingHotfixes = (Compare-Object -ReferenceObject $MasterHotfixes -DifferenceObject $Hotfixes).InputObject; if ($MissingHotfixes) { $MissingHotfixes } else { $MissingHotfixes = "No missing updates"; $MissingHotfixes } }} | Sort Name)
# You can get hotfix IDs like this
$HotfixResults[0].'Missing Hotfixes' |
# Yusuf Ozturk, 2013
# http://www.yusufozturk.info
# Lets get our master Cluster Node, thats one of the most updated Cluster Node
$MasterNode = ((Get-Cluster | Get-ClusterNode | Select Name,@{label="HotFixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}} | Sort HotFixes -Descending)[0]).Name
# Get Master Hotfix KBs and put them in a array
$MasterHotfixes = @((Get-Hotfix -ComputerName $MasterNode).HotFixID)
# Now we will use that master hotfixes to compare with others
$HotfixResults = (Get-Cluster | Get-ClusterNode | Select Name,@{label="Total Hotfixes";expression={(Get-Hotfix -ComputerName $_.Name).HotFixID.Count}},@{label="Missing Hotfixes";expression={$Hotfixes = @((Get-Hotfix -ComputerName $_.Name).HotFixID); $MissingHotfixes = (Compare-Object -ReferenceObject $MasterHotfixes -DifferenceObject $Hotfixes).InputObject; if ($MissingHotfixes) { $MissingHotfixes } else { $MissingHotfixes = "No missing updates"; $MissingHotfixes } }} | Sort Name)
# You can get hotfix IDs like this
$HotfixResults[0].'Missing Hotfixes'
You will see pretty nice output :)
|