PowerShell: как вернуть все виртуальные машины в кластер Hyper-V

Я начинаю программировать с PowerShell. Работает на Windows Server 2012.

Я пытаюсь получить список всех виртуальных машин в моем отказоустойчивом кластере и работаю с этим:

$clusterNodes = Get-ClusterNode | select Name 
ForEach($item in $clusterNodes)
{Get-VM -ComputerName $item}

И это возвращает кучу ошибок

Тем не менее, это прекрасно работает

$hosts = "server1", "server2", "server3", "server4"
ForEach($item in $hosts)
{Get-VM -ComputerName $item}

Это не удается, потому что Get-ClusterNode | select Name возвращает следующее?

Name
----
server1
server2
server3
server4

с заголовком и подчеркиванием?


person Paul S.    schedule 28.01.2014    source источник


Ответы (7)


Попробуйте это:

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

Вы должны ссылаться на свойство Name объектов, возвращаемых Get-ClusterNode.

person Trevor Sullivan    schedule 28.01.2014

Эти вкладыши могут быть немного проще. Работает на Windows Server 2012 R2, должно работать на 2012.

Get-VM –ComputerName (Get-ClusterNode –Cluster CLUSTER)

В основном получает узлы из кластера под названием «CLUSTER». Список фидов на ваш -ComputerName

OR

Get-ClusterGroup -Cluster CLUSTER | ? {$_.GroupType –eq 'VirtualMachine' } | Get-VM

Получает кластерные группы и фильтры для типа VirtualMachine.

В любом случае вы можете выполнить Get-ClusterGroup вместо Get-ClusterGroup -Cluster CLUSTER, если вы находитесь на одном из узлов.

person ScraperDave    schedule 09.05.2016

Вы также можете использовать Get-ClusterResource, поскольку роль виртуальной машины кластера является ресурсом кластера.

$clusterResource = Get-ClusterResource -Cluster SomeClusterName | Where ResourceType -eq "Virtual Machine"

Затем Get-VM также имеет параметр -ClusterObject.

Get-VM -ClusterObject $clusterResource

Из Технета -

-ClusterObject Указывает ресурс кластера или группу кластера виртуальной машины, которую необходимо получить.

https://technet.microsoft.com/en-us/library/hh848479.aspx

person cameracode    schedule 18.03.2015

Я знаю, что на это был дан ответ, но мне больше нравится этот однострочник:

Get-VM -ClusterObject (Get-ClusterResource | where ResourceType -eq "Virtual Machine")

Или, если вы делаете это удаленно, укажите ссылку на кластер:

Get-VM -ClusterObject (Get-ClusterResource -Cluster name-of-cluster | where ResourceType -eq "Virtual Machine")

Результаты могут быть переданы другим командам, например «Set-VMProcessor» или другим.

person Thomas Larsen    schedule 15.09.2016

При выборе свойств объекта отобразится заголовок. Вы можете обойти это, передав этот список в цикл, который выводит только значение:

$clusterNodes = Get-ClusterNode | select Name | foreach {$_.Name}
ForEach($item in $clusterNodes)
{Get-VM -ComputerName $item}

Я специально не тестировал ваш код, но на прошлой неделе у меня была такая же проблема.

person Steve    schedule 28.01.2014

Я думаю, что самый простой способ:

Get-VM -ComputerName VMCLUSTERNAME

Это вернет все виртуальные машины из вашего кластера. Иногда нужно полное имя с доменом.
Все забыли, что кластер виден как компьютер с ролью Hyper-V в домене. Также вы можете получить доступ к другим ролям в кластере, если будете думать о кластере как об обычном компьютере с установленными там ролями.
(Превосходно работает на powershell в Server 2016)

person Tymek    schedule 04.01.2018

Чтобы получить список виртуальных машин из кластера SCVMM, мы можем запустить приведенный ниже сценарий, обязательно измените имя кластера и имя сервера VMM, чтобы они соответствовали вашим:

$Cluster = Get-SCVMHostCluster -Name "hv19cluster" -VMMServer "vmm19n01"
$HostsInCluster = Get-SCVMHost -VMHostCluster $Cluster
#$HostsInCluster | Format-Table -Property Name, VirtualizationPlatform
ForEach ($h in $HostsInCluster) { 

$vm=Get-SCVirtualMachine -VMHost $h 
 
foreach($v in $vm){ write-host ($v)}

}
person Mamoun Khatatbeh    schedule 14.02.2021