我有一个脚本,用于将虚拟机从一个数据存储移动到另一个数据存储。我还有其他逻辑来保护存储后端和结构免受过度订阅的影响,并等待在特定时间提交新请求(业务需求)。我只移动数据存储,而不是主机。我在 Move-VM 周围有一个 try catch 块,因为我想处理故障。我运行脚本的前两三次只发生了一些错误,并且得到了我预期的处理。最后 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
答案1
我对这个问题的理解是,在 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
答案2
万一其他人遇到此问题,似乎 $task 变量不会自行更新。就我而言,我必须这样做:
while($task.state -eq "Running")
{
Start-Sleep 5
$task = Get-Task -ID $task.id
}
答案3
我也遇到过这个问题。似乎有什么东西导致 powercli 和 vcenter 服务器之间的连接中断。每次我事后运行它都会产生相同的错误。我必须关闭命令窗口并打开一个全新的窗口才能解决问题。