Alle CD-Laufwerke eines VMware-Clusters auswerfen

Jeder VMware-Administrator kennt es – der Cluster soll gepacht werden und die einzelnen Nodes müssen nacheinander neugestartet werden. Glücklicherweise besteht für den Endanwender keinerlei Handlungsbedarf, da die virtuellen Maschinen reibungslos zwischen den einzelnen Clusterknoten „online“ verschoben werden können.

Einen kleinen Show-Stopper erlebt man dann, wenn auf den virtuellen Maschinen noch ISO-Abbilder, die nicht auf dem gemeinsamen Cluster-Speicher abgelegt wurden, eingehängt sind (beispielsweise lokale CD-Laufwerke). In diesem Fall lässt sich die VM nicht verschieben und der Clusterknoten wechselt nicht in den Wartungsmodus, manuelle Interaktion ist notwendig.

Das kann, je nach Anzahl der ISOs, die eingehängt wurden, Zeit und Nerven kosten. Abhilfe schafft das folgende kleine PowerShell-Skript, welches ich für diesen Zweck geschrieben habe:

PowerCLI C:scripts> vim VMISOs.ps1

#Get all virtual machines with mounted ISOs and dismount (if wanted)
#2013 By Christian Stankowic 

##################################################################

#Get array of all Clusters
$myClusters = Get-Cluster

#Create VMs array
$VMs = @()

Write-Host "Okay - I'm going to check all VMs whether there are mounted ISO files."
Write-Host "This will take some time - get yourself some coffee.. ;-)"
Write-Host ""

#Get vms of cluster
foreach ($cluster in $myClusters) {
                #Get VMs
                #$thisVMs = Get-VM
                $thisVMs = Get-Cluster $cluster | Get-VM
                $counter=0;

                #Get VM information
                foreach ($vm in $thisVMs) {
                               #Get view
                               $vmView = $vm | Get-View

                               if( (($vm | Get-CDDrive).ISOPath) -or (($vm | Get-CDDrive).RemoteDevice) -or (($vm | Get-CDDrive).HostDevice) )
                               {
                                               #Setup output
                                               $VMInfo = "" | Select "VM","Host","ISO","RemoteDevice","HostDevice"

                                               #Write-Host "VM = $vm | Host = " ($vm | Get-VMHost).name " | ISO = " ($vm | Get-CDDrive).ISOPath " / Remote-Device = " $(vm | Get-CDDrive).RemoteDevice " / HostDevice = " $(vm | Get-CDDrive).HostDevice

                                               #Defining hostname, ESX host and ISO path
                                               $VMInfo."VM" = $vm.Name
                                               $VMInfo."Host" = ($vm | Get-VMHost).Name
                                               $VMInfo."ISO" = ($vm | Get-CDDrive).ISOPath
                                               $VMInfo."RemoteDevice" = ($vm | Get-CDDrive).RemoteDevice
                                               $VMInfo."HostDevice" = ($vm | Get-CDDrive).HostDevice

                                               #Add to array
                                               $VMs += $VMInfo
                               }

                               $counter++;
                               if( $counter % 10 -eq 0 ) {
                               Write-Host "Check $counter of " $thisVMs.length " in " $cluster " so far..."
                               }
                }
}

#sort array by Cluster
$VMs | Sort Cluster

#disconnect
$answer = Read-Host "Found " $VMs.length " mappings - force disconnect now? (y/n)"
if($answer -eq "y")
{
                foreach ($vm in $VMs)
                {
                               Write-Host "Disconnect on " $vm.VM "..."
                               Get-VM $vm.VM | Get-CDDrive | Set-CDDrive -NoMedia -Confirm:$false
                }
}
else { Write-Host "Disconnect aborted by user." }

Das Skript erfordert eine installierte PowerShell und VMware PowerCLI. Nachdem eine Verbindung zum vCenter hergestellt wurde, fragt das Skript alle Cluster und alle darin hinterlegten virtuellen Maschinen nach eingehängten CD-ROMs/ISOs ab. Anschließend wird eine Liste der betroffenen VMs angezeigt – nach einer Bestätigung werden die Medien ausgehängt, damit die Administrationsaufgaben ausgeführt werden können.

PowerCLI C:scripts> Connect-VIServer TVM-VCENTER

PowerCLI C:scripts> .VMISOs.ps1
Okay - I'm going to check all VMs whether there are mounted ISO files.
This will take some time - get yourself some coffee.. ;-)

Check 10 of  136  in  Demo-Cluster  so far...
....
VM           : TVM-WEB01
Host         : hypervisor01.localdomain.loc
ISO          :
RemoteDevice : /usr/lib/vmware/isoimages/windows.iso
HostDevice   :

Found  6  mappings - force disconnect now? (y/n): y
Disconnect on  TVM-WEB01 ...
...

Insbesondere vor Wartungsarbeiten spart mir das Skript viel Zeit. 🙂

Sharing is caring

4 Kommentare Schreibe einen Kommentar

Schreibe einen Kommentar