Quantcast
Channel: TechNet Blogs
Viewing all articles
Browse latest Browse all 36188

Usuwanie zależności maszyn wirtualnych do CSV

$
0
0

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

eN.

Author: nExoR


Viewing all articles
Browse latest Browse all 36188

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>