2017-01-13 19 views
1

У меня есть сценарий, который отключит питание и удалит все виртуальные машины, соответствующие определенному префиксу. Я использую это при тестировании других инструментов автоматизации, чтобы упростить сброс лаборатории. Скрипт подключается к нескольким предварительно заданным серверам vCenter, а затем получает список всех виртуальных машин. Проблема в том, что когда я пытаюсь отключить или удалить виртуальные машины, в нем говорится: «Не удалось найти VirtualMachine с именем« VMNAME »».PowerCLI: работа с виртуальными машинами на нескольких серверах vCenter

код, который подключается к VCENTER серверов:

$vcservers = @("VC1","VC2") 
Connect-VIServer $vcservers 

код, который получает список виртуальных машин с обеих VCENTER серверов:

$prefix = "TEST" 
ForEach ($vc in $vcservers) { 
    $vms += Get-VM -Server $vc | where {$_.Name -like "$prefix*"} 
} 

код, который выключалось и удаляет каждую виртуальную машину:

ForEach ($vm in $vms) { 
    $vmname = $vm.name 
    if ($vm.PowerState -eq "PoweredOn") { 
     Stop-VM -VM $vmname -confirm:$false 
     Remove-VM -VM $vmname -DeletePermanently -confirm:$false 
    } 
} 

Я установил свойство «Несколько» в области «Пользователи» и «AllUsers» с помощью Set-PowerCLIConfigu ration, поэтому он должен искать все серверы vCenter, но по какой-то причине он не работает.

EDIT 1/25/17 Обновлен код, чтобы переменная $ vcservers была последовательной.

+0

Что содержит '$ vms'? Я предполагаю, что это массив массивов, в то время как вы ожидаете массив виртуальных машин. – Swonkie

+0

Он содержит список виртуальных машин, который соответствует поиску из второго блока кода. Это массив, содержащий имя, powerstate и другие свойства. – McKenning

ответ

1

Поскольку первая проблема (связанная с именами переменных) была решена, в настоящее время я подозреваю, что проблема связана с тем, что PowerCLI не уверен, на чем VCenter виртуальных машин, которые вы хотите удалить в прямом эфире. Таким образом, вы можете пойти VCenter vCenter вместо того, чтобы пытаться работать со всеми vCenters сразу:

$prefix = "TEST" 
$vcservers = @("VC1","VC2") 
ForEach ($vc in $vcservers) { 
    Connect-VIServer $vc 
    $vms += Get-VM -Server $vc | where {$_.Name -like "$prefix*"} 

    ForEach ($vm in $vms) { 
     $vmname = $vm.name 
     if ($vm.PowerState -eq "PoweredOn") { 
      Stop-VM -VM $vmname -confirm:$false 
      Remove-VM -VM $vmname -DeletePermanently -confirm:$false 
     } 
    Disconnect-VIServer $vc 
} 
+0

Хороший улов, но это была ошибка в моем переводе с исходного кода. Я обновил вопрос, чтобы переменные были одинаковыми. – McKenning

+1

У меня нет vcenter для тестирования, но, глядя на вашу проблему, я думаю, что это может быть потому, что при запуске Stop-VM и Remove-VM он не знает, к какому VCenter следует смотреть. То, что вы можете сделать, - это все, включая Connect-VIServer, внутри одного и того же цикла ForEach. Попробуйте это и дайте мне знать, как это происходит. Если это сработает, я добавлю его как отдельный ответ. – twglomski

+0

Я не уверен, как содержать все в одном и том же цикле ForEach. Как я могу сделать цикл на vms, когда я не подключаюсь к vCenters, пока не окажусь внутри цикла foreach? – McKenning

 Смежные вопросы

  • Нет связанных вопросов^_^