Comment utiliser PowerShell pour administrer Hyper-v Cluser

12

J'ai 2 hôtes avec Server 2016 Datacenter

Sur chaque hôte, j'ai actuellement 2 machines virtuelles utilisant le stockage partagé

Je peux faire toutes les choses du cluster, c'est-à-dire migrer en direct, déplacer le stockage,

J'ai cherché partout sur google pour un script pour pouvoir enregistrer tous les vm dans le cluster en même temps.

Si je lance ceci:

$clusterNodes = Get-ClusterNode;
$Name = ForEach($item in $clusterNodes){Get-VM -ComputerName $item.Name; }
{save-VM -ComputerName $item.Name; }

Il sauvera les VM cependant Il m'invitera deux fois pour les noms des VMs une fois pour chaque hôte.

Mon objectif global est de pouvoir reconfigurer toutes les VM du cluster à partir d'un seul PC, et les VM se déplacent beaucoup afin qu'elles ne soient pas toujours sur le même hôte.

Exemple:

Enregistrer tous les VM

Déplacez l'os hors du stockage partagé:

Set-VM pv02 -SnapshotFileLocation C:\ClusterStorage\Volume1\pv02
Set-VM pv02 -SmartPagingFilePath C:\ClusterStorage\Volume1\pv02
Set-VMHardDiskDrive -VMName  pv02 -ControllerType SCSI -Path C:\ClusterStorage\Volume1\pv02\pv02.vhdx

Démarrer les VM

Si je me connecte à chaque hôte individuellement, la commande fonctionnera correctement, mais dans ma production, j'ai 7 hôtes avec environ 100 machines virtuelles.

Anthony Fornito
la source

Réponses:

8

Si vous souhaitez adresser l'intégralité du cluster à partir de PowerShell, la meilleure solution est probablement le module PowerShell dans System Center Virtual Machine Manager. Il a été construit pour cela.

Le module PowerShell que vous utilisez était destiné aux scripts à hôte unique. Il peut encore fonctionner. Vous pouvez restructurer votre code ci-dessus. Par exemple:

$clusterNodeNames = (Get-ClusterNode -Cluster ClusterName).Name
$AllVMsInCluster = Get-VM -ComputerName $clusterNodeNames
$AllVMsInCluster | Save-VM -Confirm:$false
Jake Oshins
la source
Jake pouvez-vous m'expliquer comment le '$ AllVMsInCluster | Save-VM -Confirm: $ false 'parcourt chaque machine virtuelle, j'essaie de terminer la deuxième partie de ma tâche, le' $ AllVMsInCluster | Set-VM -SnapshotFileLocation C: \ ClusterStorage \ Volume1 \ 'mais je ne peux pas comprendre comment définir le répertoire à la fin, c'est-à-dire. 'C: \ ClusterStorage \ Volume1 \ VM1', 'C: \ ClusterStorage \ Volume1 \ VM2'
Anthony Fornito
Vous devez lire un livre sur PowerShell. Le concept fondamental est le «pipeline» et les objets le traversent. Une "applet de commande" agit sur chacun des objets qui lui sont transmis sur le pipeline. Si vous souhaitez modifier le comportement au fur et à mesure que les choses passent, vous voulez probablement une construction comme: $ AllVMsInCluster | Foreach-Object {Set-VM -SnapshotFileLocation C: \ ClusterStorage \ Volume1 \ $ _. Name}
Jake Oshins