Powershell

PowerCLI Move-VM 返回失敗,但 vm 仍在移動

  • July 26, 2019

我有一個將虛擬機從一個數據儲存移動到另一個的腳本。我有其他邏輯來保護儲存後端和結構免於過度訂閱並等待在特定時間送出新請求(業務需求)。我只移動數據儲存而不移動主機。我在 Move-VM 周圍有一個 try catch 塊,因為我想處理故障。我執行腳本的前兩三次只發生了一些錯誤,並且按預期進行了處理。最後 5 次移動返回錯誤,但 VM 移動請求成功,如我在 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

引用自:https://serverfault.com/questions/654415