首页 > 解决方案 > 如何使用 PowerShell (PowerCLI) 确定 VM 自定义规范状态?

问题描述

设想

我目前正在处理应该执行以下任务的 Powershell 脚本:

  1. 克隆给定的虚拟机
  2. 执行自定义规范任务
  3. 执行一些克隆后任务,例如加入域、在 AD 中移动计算机帐户……

问题/问题

我需要检测定制过程的当前状态。是否可以使用 PowerCLI 命令获取它?

注意:如果在自定义任务中未完成 sysprep 和重新启动时继续执行脚本,则以下任务将失败...

已经测试的场景

等待工具

如果已经尝试使用 power-cli 命令 wait-tools 等待 syspep 完成。这里的问题是,在 sysprep 完成之前 vmware 工具已经在工作,并且脚本运行出错,因为 vm 在 sysprep 之后仍然需要最终重新启动

VI-活动

我什至尝试处理目标机器最近的 VI 事件。特别是对事件“CustomizationStartedEvent”、“CustomizationSucceeded”和“CustomizationFailed”做出反应 与等待工具相同的情况:当 sysprep 完成并且 vm 等待最终重新启动时,将发出“CustomizationSucceeded”事件

用 Restart-Computer 替换 Restart-VMGuest

这两个命令都会引发错误“VMTools 未运行”或“WinRM 未运行”。

使用 VM 属性测试 VMware 工具状态

我还尝试使用$GetVMNew.ExtensionData.Guest.ToolsRunningStatus. 但它的结果与 Wait-Tools 相同

guestcust.log对内容做出反应

日志中的最后一个条目与“CustomizationSucceeded”VI 事件具有相同的时间戳。所以这会导致同样的重启时间问题

等待域加入

域加入发生在 sysprep 完成并且 vm self 尚未启动之前

标签: powershellvmwarepowercli

解决方案


也许最简单的方法是使用Get-VIEvent查找“自定义成功”事件。或者,如果您的操作系统自定义过程包含新的来宾主机名,请等待$_.Guest.Hostname来自的属性获取Get-VM新名称。

在一种情况下,我通过将关闭命令-GuiRunOnce作为New-OsCustomizationSpec. 然后在克隆过程之后启动 vm 后,我等待 vm 完成启动(Wait-Tools在这里可能同样好 - 老实说,我不记得为什么我不使用它。)

"Waiting for vmtools to get IP address..."
do {
  Start-Sleep -Sec 3
  $cloneObj = Get-View -ViewType VirtualMachine -Property Guest -Filter @{"name" = $vmname}
  $IP = $cloneObj.Guest.IPaddress
} until ($IP)

然后我等到-GuiRunOnce关闭命令完成并且虚拟机关闭,此时可以安全地假设 sysprep 和自定义已完成(除非操作系统崩溃,我想)。

"Preparing clone. Sysprep will take a few minutes..."
do {Start-Sleep -Sec 3}
until ((Get-VM $vmName | Select -Expand PowerState) -eq "PoweredOff")

当然,之后您可能需要重新启动虚拟机。对于您的需求,这可能有点像鲁布·戈德堡;由于其他原因,我需要暂时关闭 vm,但基本建议是-GuiRunOnce用作确认操作系统在 sysprep 自定义后启动的一种方式。除了关闭之外,您可以在某处写入文件,然后检查其是否存在,等等Invoke-VMScript也可能会有所帮助,例如,如果您的克隆无法立即访问您的网络,并且您的-GuiRunOnce操作的完成将只能从克隆内部进行验证。

您可能会考虑在操作系统自定义过程中加入域,而不是之后。特别是使用 AD 计算机帐户,我想您可以在尝试移动它之前检查它是否存在于您期望的位置。


推荐阅读