Usuwanie zależności maszyn wirtualnych do CSV
25o EHLO
Scenariusz
Wraz z kazda wersja Windows Server rozbudowywane sa commandlety do wszystkich funkcji systemu. Nie inaczej jest w przypadku klastra - pojawila sie duza ilosc funkcji, pozwalajacych na manipulacje zasobami. Okazuje sie jednak, ze pewne rzeczy sa nadal mocno ukryte i nawet przy pomocy PS nie jest latwo sie do nich dostac. Trafilem ostatnio na taki scenariusz:
- Jest klaster Hyper-v, na którym dziala wiele VM. Zalozony zostal nowy, wiekszy CSV, na który zostaly przemigrowane maszyny przy pomocy 'Storage Migration'. Stary CSV ma zostac wylaczony. Jednak w wyniku jakis blizej niewyjasnionych bledów, czesc maszyn nadal zalezna jest od starego CSV. Jedynym miejscem, gdzie jest to widoczne, jest interfejs 'Failover Cluster Manager':
Przy próbie wylaczenia CSV dzieje sie oczywista rzecz: maszyny, które maja zaleznosc, zostaja zapisywane (Save State) i nie da sie uruchomic.
Zaczne od podstawowej ciekawostki - czyli Zasobów klastra (Resources). Jest co prawda commandlet 'get-clusterResources' ale ... nie zwraca on obiektów typu CSV. Sa dyski fizyczne (Physical Disk), sa *** dyskowe (Storage Pools), ale nie CSV. Podobnie dzieje sie jesli próbujemy wylistowac zaleznosci maszyny wirtualnej - 'get-ClusterResourceDependency' nigdzie nie wskazuje na zadnej CSV. I tu zaczynaja sie schody - bo nie tylko nie da sie tej zaleznosci zlikwidowac, ale nawet wyswietlic!
WMI - privateProperties
Tajemnica pogrzebana jest troche glebiej i jedynym sposobem jest dobranie sie do obiektów za pomoca WMI/CIM. Informacje dotyczace zaleznosci zapisane sa w zasobie 'Virtual Machine Configuration'. Zawiera on atrybut 'privateProperties', który z kolei zawiera wartosc 'DependsOnClusterSharedVolumes'. 'PrivateProperties' to bardzo specyficzny parametr, poniewaz jest wyliczany dynamicznie. Nie ma go zatem w opisach MOF. Zajrzyjmy jak wyglada taki obiekt i jak mozna podejrzec owa zaleznosc.
Dla celów scenariusza przyjalem ze:
- klaster nazywa sie 'cluster' w domenie 'domain.com'
- maszyna wirtualna, która bede badal to 'Virtual Machine 1o'
- sa dwa CSV - 'CSV' i 'tempCSV'
- bede usuwal zaleznosc z 'CSV'
Najpierw trzeba utworzyc referencje do obiektu zasobu konfiguracji maszyny wirtualnej. Nazwa takiego zasobu to zawsze 'Virtual Machine Configuration <VMName>'
PS C:\scriptz :))o- $vmconfig=Get-WmiObject -namespace "root\mscluster" -class MSCluster_Resource -ComputerName cluster -Filter "name='Virtual Machine Configuration Virtual Machine 1o'"
Nastepnie mozna odczytac, co kryje sie w zaleznosciach CSV:
PS C:\scriptz :))o- $vmconfig.PrivateProperties.DependsOnSharedVolumes
72ba828a-d116-43e5-92bc-d10ea93dbbe3
fff952c6-09d0-4a13-bc7f-2c9e0c0c74fe
Jak widac sa tam zapisane GUIDy dysków CSV. Aby sprawdzic który-jest-który, wystarczy sprawdzic atrybut ID dla CSV:
PS C:\scriptz :))o- Get-ClusterSharedVolume -Cluster cluster|select name,id
Name Id
---- --
CSV 72ba828a-d116-43e5-92bc-d10ea93dbbe3
tempCSV fff952c6-09d0-4a13-bc7f-2c9e0c0c74fe
Teraz widac, ze nalezy usunac powiazanie z GUID '72ba828a-d116-43e5-92bc-d10ea93dbbe3'. Nalezy w tym celu zalozyc obiekt typu 'privateParoperties', zmienic mu odpowiednio wartosc, a na koniec przypisac jego wartosc do obiektu zasobu. Poniewaz jednak atrybut zmienia sie poprzez zapisanie go a nie odjecie wartosci, bedzie mi potrzebny GUID tego, który zostaje, czyli tempCSV:
$privateProperties=$vmconfig.PrivateProperties
$privateProperties.dependsonsharedvolumes=@('fff952c6-09d0-4a13-bc7f-2c9e0c0c74fe')
$vmconfig.privateproperties=$privateProperties
$vmconfig.put()
Automatyzacja
Na koniec - jak to wszystko zlozyc, zeby wykonac dla wszystkich maszyn, bo recznie... to wiadomo co q:
Zapytamy o wszystkie obiekty konfiguracji, nastepnie przefiltrujemy tylko te, które zawieraja GUID '72ba828a....' i dla nich wykonamy wyzej przedstawiona operacje przypisania:
Get-WmiObject -namespace "root\mscluster" -class MSCluster_Resource -ComputerName cluster -Filter "type='Virtual Machine Configuration'"|`
?{$_.privateproperties.dependsonsharedvolumes -like '*72ba828a-d116-43e5-92bc-d10ea93dbbe3*'}|`
%{
$pp=$_.privateproperties;
$pp.dependsonsharedvolumes=@('fff952c6-09d0-4a13-bc7f-2c9e0c0c74fe');
$_.privateproperties=$pp;
$_.put()
}
...i pozamiatane. Mozna shutdownowac CSV.
#Refs
- Virtual Machine Configuration: https://msdn.microsoft.com/en-us/library/cc948924%28v=vs.85%29.aspx
- DependsOnClusterSharedVolumes: https://msdn.microsoft.com/en-us/library/ee342526%28v=vs.85%29.aspx
- Modifying WMI object: https://technet.microsoft.com/en-us/library/ee692805.aspx
- Private Properties of a Cluster Object: https://msdn.microsoft.com/en-us/library/aa371804%28v=vs.85%29.aspx
eN.
Author: nExoR