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

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

6 ответов


дайте это выстрел:

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

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


эти лайнеры, возможно, немного проще. Работает для Windows Server 2012 R2, должен работать для 2012.

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

в основном получает узлы из кластера под названием "кластер". Список каналов для вашего-ComputerName

или

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

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

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


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

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

тогда Get-VM также имеет параметр-ClusterObject

Get-VM -ClusterObject $clusterResource

Из TechNet -

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

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


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

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

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


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

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" или другие.


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

Get-VM -ComputerName VMCLUSTERNAME

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