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

eN.

Author: nExoR