Назад | Перейти на главную страницу

PowerCLI Move-VM возвращает ошибку, но виртуальная машина все еще перемещается

У меня есть сценарий, который перемещает виртуальные машины из одного хранилища данных в другое. У меня есть другая логика для защиты серверной части хранилища и структуры от чрезмерной подписки и ожидания отправки новых запросов в определенное время (бизнес-требования). Я перемещаю только хранилища данных, а не хосты. У меня есть блок try catch вокруг Move-VM, поскольку я хочу обработать сбой. Первые два или три раза я запускал скрипт, возникало только несколько ошибок, и они обрабатывались, как я ожидал. Последние 5 раз перемещение возвращало ошибку, но запрос на перемещение виртуальной машины был успешным, о чем свидетельствует задача, которую я вижу в vCenter. Эта работа также успешно завершается. Move-VM не использует переключатель RunAsync. Что заставило бы Move-VM вернуть ошибку, но успешно отправить запрос на перемещение.

$VMs = Get-VM -Name $ComputerName
$CurrentDataStores = Get-Datastore

foreach ($VM in $VMs){
   foreach ($store in $CurrentDataStores){
      if ($store.name -eq "$Datastore"){
         $rawDatastore = $store
      }
      if ($store.id -Match $VM.DatastoreIdList){
         $VMDatastore = $store.name
      } 
   }
   if ($VMDatastore -eq "$Datastore"){
      Write-Output "$VM : is already on requested Datastore"
   }
   else{
      try {
          Move-VM -VM $VM -Datastore $rawDatastore -ErrorAction Stop
      }
      catch {
         Write-OutPut "$VM : Unable to move VM to new Datastore" 
         continue
      }
   }
}

Move-VMDatastore : <VM Name> : Unable to move VM to new Datastore
At line:1 char:1
+ Move-VMDatastore -ComputerName <VM Name> -Datastore <Move TO Datastore>
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Move-VMDatastore


Move-VMDatastore : 12/24/2014 12:50:02 AM    Move-VM        Operation is not valid due to the current state of the
object.
At line:1 char:1
+ Move-VMDatastore -ComputerName <ComputerName[]> -Datastore <Datastore>
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Move-VMDatastore

Насколько я понимаю, эта проблема заключается в том, что при реализации Move-VM PowerCLI запускает асинхронную задачу, получает задачу и затем запускает ее. Wait-Task в теме.

Если операция выполняется очень быстро, с этой проблемой будет отказано. Это обоснованное предположение, основанное на том факте, что это именно то исключение, которое вы получаете, когда Wait-Task за выполненную задачу.

Итак, в основном ваша проблема в том, что ваш сервер VMware слишком быстро...

Обходной путь - использовать переключатель -RunAsync и самостоятельно реализовать правильное поведение. Что-то вроде:

$Task = Move-VM -VM $VM -Datastore $rawDatastore -ErrorAction Stop -RunAsync
while($true)
{
    switch ($task.State)
    {
         'Success' { $Task.Result; break }
         'Error' { throw $Task.ExtensionData.Info.Error.LocalizedMessage }
         Start-Sleep 5
    }
}

Изменить: я видел ту же проблему с Stop-VM и Remove-VM и работал с ними таким же образом.

Эта проблема была отправлена ​​для улучшения команде PowerCLI здесь: https://powercli.ideas.aha.io/ideas/PCLI-I-208

На всякий случай, если кто-то еще столкнется с этой проблемой, может показаться, что переменная $ task не обновляется сама по себе. В моем случае мне пришлось сделать:

 while($task.state -eq "Running")
 {
   Start-Sleep 5
   $task = Get-Task -ID $task.id
 }

У меня тоже была эта проблема. Кажется, что что-то вызывает повреждение соединения от powercli к серверу vcenter. Каждый раз, когда я запускаю его постфактум, выдает одну и ту же ошибку. Мне нужно закрыть командное окно и открыть новое окно, чтобы решить проблему.