25o EHLO
Scenariusz
Wraz z każdą wersją Windows Server rozbudowywane są commandlety do wszystkich funkcji systemu. Nie inaczej jest w przypadku klastra - pojawiła się duża ilość funkcji, pozwalających na manipulację zasobami. Okazuje się jednak, że pewne rzeczy są nadal mocno ukryte i nawet przy pomocy PS nie jest łatwo się do nich dostać. Trafiłem ostatnio na taki scenariusz:
- Jest klaster Hyper-v, na którym działa wiele VM. Założony został nowy, większy CSV, na który zostały przemigrowane maszyny przy pomocy 'Storage Migration'. Stary CSV ma zostać wyłączony. Jednak w wyniku jakiś bliżej niewyjaśnionych błędów, część maszyn nadal zależna jest od starego CSV. Jedynym miejscem, gdzie jest to widoczne, jest interfejs 'Failover Cluster Manager':
Przy próbie wyłączenia CSV dzieje się oczywista rzecz: maszyny, które mają zależność, zostają zapisywane (Save State) i nie da się uruchomić.
Zacznę od podstawowej ciekawostki - czyli Zasobów klastra (Resources). Jest co prawda commandlet 'get-clusterResources' ale ... nie zwraca on obiektów typu CSV. Są dyski fizyczne (Physical Disk), są *** dyskowe (Storage Pools), ale nie CSV. Podobnie dzieje się jeśli próbujemy wylistować zależności maszyny wirtualnej - 'get-ClusterResourceDependency' nigdzie nie wskazuje na żadnej CSV. I tu zaczynają się schody - bo nie tylko nie da się tej zależności zlikwidować, ale nawet wyświetlić!
WMI - privateProperties
Tajemnica pogrzebana jest trochę głębiej i jedynym sposobem jest dobranie się do obiektów za pomocą WMI/CIM. Informacje dotyczące zależności zapisane są w zasobie 'Virtual Machine Configuration'. Zawiera on atrybut 'privateProperties', który z kolei zawiera wartość 'DependsOnClusterSharedVolumes'. 'PrivateProperties' to bardzo specyficzny parametr, ponieważ jest wyliczany dynamicznie. Nie ma go zatem w opisach MOF. Zajrzyjmy jak wygląda taki obiekt i jak można podejrzeć ową zależność.
Dla celów scenariusza przyjąłem że:
- klaster nazywa się 'cluster' w domenie 'domain.com'
- maszyna wirtualna, którą będę badał to 'Virtual Machine 1o'
- są dwa CSV - 'CSV' i 'tempCSV'
- będę usuwał zależność z 'CSV'
Najpierw trzeba utworzyć referencję 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'"
Następnie można odczytać, co kryje się w zależnościach CSV:
PS C:\scriptz :))o- $vmconfig.PrivateProperties.DependsOnSharedVolumes
72ba828a-d116-43e5-92bc-d10ea93dbbe3
fff952c6-09d0-4a13-bc7f-2c9e0c0c74fe
Jak widać są tam zapisane GUIDy dysków CSV. Aby sprawdzić który-jest-który, wystarczy sprawdzić 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 widać, że należy usunąć powiązanie z GUID '72ba828a-d116-43e5-92bc-d10ea93dbbe3'. Należy w tym celu założyć obiekt typu 'privateParoperties', zmienić mu odpowiednio wartość, a na koniec przypisać jego wartość do obiektu zasobu. Ponieważ jednak atrybut zmienia się poprzez zapisanie go a nie odjęcie wartości, będzie 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 złożyć, żeby wykonać dla wszystkich maszyn, bo ręcznie... to wiadomo co q:
Zapytamy o wszystkie obiekty konfiguracji, następnie przefiltrujemy tylko te, które zawierają GUID '72ba828a....' i dla nich wykonamy wyżej przedstawioną operację 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. Można shutdownować CSV.
#Refs
- Virtual Machine Configuration: http://msdn.microsoft.com/en-us/library/cc948924%28v=vs.85%29.aspx
- DependsOnClusterSharedVolumes: http://msdn.microsoft.com/en-us/library/ee342526%28v=vs.85%29.aspx
- Modifying WMI object: http://technet.microsoft.com/en-us/library/ee692805.aspx
- Private Properties of a Cluster Object: http://msdn.microsoft.com/en-us/library/aa371804%28v=vs.85%29.aspx
eN.
Author: nExoR