如何修改vRA/vRO PowerCLI脚本实现VM关机状态启用VBS
vRO环境VBS启用脚本修正方案
你之前修改脚本无法正常启停虚拟机的核心原因是 vRO对接vCenter的所有操作默认是异步执行,触发关机/配置/开机操作后如果不等待任务完成、不校验实际状态就执行下一步,会因为时序错位导致操作失败。以下是可直接上线使用的修正版本:
修正后完整脚本
// Input: inputProperties from vRA var enableVBS = inputProperties.customProperties.enableVBS if (enableVBS == "true") { var name = inputProperties.resourceNames[0] var vms = VcPlugin.getAllVirtualMachines(null, name) var vm = vms[0] // 记录虚拟机初始电源状态,避免给原本关机的VM误开机 var originalPowerState = vm.runtime.powerState var task = null var waitLoop = 0 // 第一步:VM处于开机状态时先执行关机 if (originalPowerState === VcVirtualMachinePowerState.poweredOn) { // 优先走VMware Tools软关机,无Tools环境可替换为 vm.powerOffVM_Task() 强制断电 vm.shutdownGuest() // 轮询等待关机完成,最长等待300秒,可按需调整超时阈值 while (vm.runtime.powerState !== VcVirtualMachinePowerState.poweredOff && waitLoop < 60) { System.sleep(5000) waitLoop++ // 刷新VM最新状态 vm = VcPlugin.getVirtualMachineByMor(vm.mor) } if (vm.runtime.powerState !== VcVirtualMachinePowerState.poweredOff) { throw "虚拟机关机超时,VBS配置流程终止,请手动检查VM状态" } } // 第二步:关机状态下执行VBS相关配置 var bootOpts = new VcVirtualMachineBootOptions() var flags = new VcVirtualMachineFlagInfo() var spec = new VcVirtualMachineConfigSpec() bootOpts.efiSecureBootEnabled = true; flags.vbsEnabled = true; flags.vvtdEnabled = true; spec.firmware = VcGuestOsDescriptorFirmwareType.efi; spec.nestedHVEnabled = true; spec.bootOptions = bootOpts; spec.flags = flags; // 提交重配置任务并等待完成 task = vm.reconfigVM_Task(spec) task.waitForEnd() if (task.info.state !== VcTaskInfoState.success) { throw "VBS配置失败,错误详情:" + task.info.error.msg } // 第三步:如果VM初始状态为开机,配置完成后自动开机 if (originalPowerState === VcVirtualMachinePowerState.poweredOn) { task = vm.powerOnVM_Task(null) task.waitForEnd() if (task.info.state !== VcTaskInfoState.success) { throw "VBS配置完成但虚拟机开机失败,错误详情:" + task.info.error.msg } } }
关键逻辑说明
- 初始状态留存:脚本启动时首先记录VM原始电源状态,不会对本来就处于关机状态的VM执行多余开机操作
- 全链路状态校验:关机环节采用轮询机制确认VM真正进入关机状态,重配置、开机环节等待vCenter任务返回成功结果后再进入下一步,彻底解决异步任务时序问题
- 异常抛出:每个环节超时/失败时直接抛出明确错误信息,方便vRA工作流定位故障点
前置注意事项
- 目标虚拟机硬件版本需≥14,操作系统版本需为Windows 10 1709/Windows Server 2016及以上,否则VBS功能无法正常生效
- 软关机依赖虚拟机内正常运行的VMware Tools,如环境内无统一部署Tools,可将软关机逻辑替换为
vm.powerOffVM_Task()强制断电,注意强制断电可能导致系统文件损坏 - 如环境内有防病毒/EDR类软件拦截软关机指令,可适当调长关机等待超时阈值
内容的提问来源于stack exchange,提问作者messi
相关产品推荐
相关产品推荐

