powershell - 如何使用 PowerShell (PowerCLI) 确定 VM 自定义规范状态?
问题描述
设想
我目前正在处理应该执行以下任务的 Powershell 脚本:
- 克隆给定的虚拟机
- 执行自定义规范任务
- 执行一些克隆后任务,例如加入域、在 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 尚未启动之前
解决方案
也许最简单的方法是使用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 计算机帐户,我想您可以在尝试移动它之前检查它是否存在于您期望的位置。
推荐阅读
- ios - 如何执行从 UIView 到 ViewController 的导航
- eclipse - Eclipse 打开资源对话框:如何按项目名称对搜索结果进行排序/排序?
- phpmyadmin - 错误 1698 (28000): 安装 phpmyadmin 时用户 'debian-sys-maint'@'localhost' 的访问被拒绝
- c++ - 容器比较器使用虚拟实例
- sql - 比较并列出有数据变化的 2 个表的列数据。(类似于减号,但只需要列出更改数据的列)
- javascript - 在 reactjs 中保留表列的缓存
- entity-framework - 如何测试 DbContext 是否在内存中?
- python - 玛雅 EDMS \n 字符显示在主菜单中
- javascript - 有没有办法在 Javascript 对象中获取函数或属性
- docker - 在传入的 HTTP 请求上启动 docker 容器