簡體   English   中英

如何使用PowerShell(PowerCLI)確定VM自定義規范狀態?

[英]How to determine a VMs customization specification state with PowerShell (PowerCLI)?

腳本

我目前正在研究Powershell腳本,該腳本應執行以下任務:

  1. 克隆給定的虛擬機
  2. 執行自定義規范任務
  3. 做一些后期克隆任務,例如域加入,在AD中移動計算機帳戶...

問題/問題

我需要檢測定制過程的當前狀態。 是否可以通過PowerCLI命令獲得它?

注意:如果在自定義任務中未完成sysprep和重新啟動的情況下繼續執行腳本,則以下任務將失敗...

已經測試過的場景

等待工具

如果已經嘗試使用power-cli命令wait-tools等待syspep完成。 這里的問題是,在sysprep完成之前vmware工具已經在工作,並且腳本運行出錯,因為sysprep之后vm仍需要最后一次重啟

VI-活動

我什至嘗試處理目標機器的最近VI事件。 尤其是對事件“ CustomizationStartedEvent”,“ CustomizationSucceeded”和“ CustomizationFailed”做出反應時,使用等待工具的情況相同:當sysprep完成並且vm等待最終重啟時,將發出“ CustomizationSucceeded”事件。

將Restart-VMGuest替換為Restart-Computer

這兩個命令都引發錯誤“ VMTools not running”或“ WinRM not running”。

使用VM屬性測試VMware工具狀態

我還嘗試使用$GetVMNew.ExtensionData.Guest.ToolsRunningStatus獲取vmware工具狀態。 但其結果與Wait-Tools相同

guestcust.log內容guestcust.log反應

日志中的最后一個條目具有與“ CustomizationSucceeded” VI事件相同的時間戳。 因此,這將導致重新啟動出現相同的計時問題

等待域加入

域聯接在sysprep完成並且vm self還沒有啟動之前發生

我不確定您是什么意思CustomizationSpec的狀態,無論如何,您都可以使用Get-OSCustomizationSpec PowerCLI cmdlet來使用Customization Specs:

例如,您可以更改網絡地址,設置虛擬機名稱等。請參見示例以在克隆過程之前更改規范的IP地址:

Get-OSCustomizationSpec ConfSpecName | 
Get-OSCustomizationNicMapping | 
Set-OSCustomizationNicMapping -IpMode:"UseStaticIP" -IpAddress 10.0.0.10 `
-SubnetMask "255.255.255.0" -DefaultGateway 10.0.0.254 -Dns 10.0.0.100

查看所有PowerCLI CustomizationSpec Cmdlet:

PS C:\> Get-Command *OS*Spec* | Select Name

Name
----
Get-OSCustomizationSpec
New-OSCustomizationSpec
Remove-OSCustomizationSpec
Set-OSCustomizationSpec

也許最簡單的方法是使用Get-VIEvent查找“自定義成功”事件。 或者,如果您的操作系統自定義過程包括新的來賓主機名,請等待Get-VM$_.Guest.Hostname屬性選擇新名稱。

在一種情況下,我正在通過將關閉命令作為New-OsCustomizationSpec-GuiRunOnce參數的一部分來處理類似的問題。 然后,在克隆過程之后啟動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關閉命令完成並且vm已關閉,此時可以安全地假設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操作只能在克隆內部進行驗證。

您可以考慮在OS定制過程中加入域,而不是在之后。 我想專門使用AD計算機帳戶,在嘗試移動它之前,您可以檢查它是否存在於期望的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM