將修補程式或擴充功能套用至 ESX/ESXi 主機之前,您可能想將修補程式和擴充功能套用至測試環境中的主機以進行測試。然後,您可以使用 Update Manager PowerCLI,將經過測試的基準匯出至另一個 Update Manager 伺服器執行個體,並將修補程式和擴充功能套用至其他主機。

Update Manager PowerCLI 是建置於 Windows PowerShell 上的命令行和指令碼工具,它提供用於管理和自動化 Update Manager 的 cmdlet 集。如需有關安裝和使用 Update Manager PowerCLI 的詳細資訊,請參閱《VMware vSphere Update Manager PowerCLI 安裝與管理指南》

此工作流程描述如何使用 Update Manager 執行個體來測試修補程式,以及如何將包含經過測試之修補程式的修補程式基準匯出至另一個 Update Manager 執行個體。

  1. 建立固定主機修補程式基準。

    建立包含要測試之修補程式的固定修補程式基準。當有新修補程式下載至 Update Manager 修補程式存放庫時,固定修補程式基準不會變更其內容。您可以從 Update Manager [管理] 視圖的基準和群組索引標籤中建立固定修補程式基準。如需詳細資訊和詳細程序,請參閱 建立固定修補程式基準

  2. 將修補程式基準連結至包含您要掃瞄或修復之主機的容器物件。

    容器物件可以是資料夾、叢集或資料中心。您可以從 Update Manager [符合性] 視圖中將基準和基準群組連結至物件。如需有關將基準和基準群組連結至 vSphere 物件的詳細資訊,請參閱 將基準和基準群組連結至物件

  3. 掃瞄容器物件。

    將基準連結至選取的容器物件後,您必須對其進行掃瞄以檢視容器中主機的符合性狀態。您可以手動掃瞄選取的物件以立即開始掃瞄。如需有關如何手動掃瞄主機的詳細指示,請參閱 手動啟動 ESX/ESXi 主機掃瞄

    您也可以排程掃瞄工作,以便在您方便的時候掃瞄容器物件中的主機。如需有關排程掃瞄的詳細資訊和詳細指示,請參閱 排程掃瞄

  4. 檢閱 Update Manager 用戶端 [符合性] 視圖中顯示的掃瞄結果。

    如需有關檢視掃瞄結果的詳細程序以及有關符合性狀態的詳細資訊,請參閱 檢視 vSphere 物件的掃瞄結果和符合性狀態

  5. (選用) 將已連結基準中的修補程式暫存至要更新的主機。

    您可以在套用修補程式前將其暫存並從 Update Manager 伺服器複製到主機。暫存修補程式可加快修復程序,且有助於盡可能減少修復期間的主機停機時間。如需有關將修補程式和擴充功能暫存至主機的詳細程序,請參閱 將修補程式和擴充功能暫存至 ESX/ESXi 主機

  6. 修復容器物件。

    修復處於「不符合標準」狀態的主機,使其符合已連結的基準。如需有關對照修補程式或擴充功能基準修復主機的詳細資訊,請參閱 對照修補程式或擴充功能基準修復主機

  7. 從用於測試修補程式的 Update Manager 伺服器中匯出修補程式基準,然後將其匯入至另一個 Update Manager 伺服器。

    您可以使用 Update Manager PowerCLI 指令碼,將修補程式基準從某個 Update Manager 伺服器匯出後匯入至另一個伺服器。下列指令碼範例可在 $destinationServer 上建立基準 MyBaseline 的複本。

    備註︰

    該指令碼適用於固定和動態修補程式基準以及擴充功能基準。

    # $destinationServer = Connect-VIServer <ip_address_of_the_destination_server>
    # $sourceServer = Connect-VIServer <ip_address_of_the_source_server>
    # $baselines = Get-PatchBaseline MyBaseline -Server $sourceServer
    # ExportImportBaselines.ps1 $baselines $destinationServer
    Param([VMware.VumAutomation.Types.Baseline[]] $baselines, [VMware.VimAutomation.Types.VIServer[]]$destinationServers)
    
    $ConfirmPreference = 'None'
    $includePatches = @()
    $excludePatches = @()
    
    function ExtractPatchesFromServer([VMware.VumAutomation.Types.Patch[]]$patches, 
    [VMware.VimAutomation.Types.VIServer]$destinationServer){
    	$result = @()
    	if ($patches -ne $null){
    		foreach($patch in $patches){
    			$extractedPatches = Get-Patch -Server $destinationServer -SearchPhrase $patch.Name
    if ($extractedPatches -eq $null){
    Write-Warning -Message "Patch '$($patch.Name)' is not available on the server $destinationServer"
    } else {
    $isFound = $false
    foreach ($newPatch in $extractedPatches){
    if ($newPatch.IdByVendor -eq $patch.IdByVendor){
    $result += $newPatch
    $isFound = $true
    	  		}
    	  	}
    if ($isFound -eq $false) {
    Write-Warning -Message "Patch '$($patch.Name)' with VendorId '$($patch.IdByVendor)' is not available on the server $destinationServer"
        }
       }
      }
     }
    return .$result;
    }
    
    function
    CreateStaticBaseline([VMware.VumAutomation.Types.Baseline]$baseline,[VMware.VimAutomation.Types.VIServer]$destinationServer){
    $includePatches = ExtractPatchesFromServer $baseline.CurrentPatches $destinationServer
    if ($includePatches.Count -lt 1){
    write-error "Static baseline '$($baseline.Name)' can't be imported.No one of the patches it contains are available on the server $destinationServer"
    } else {
    $command = 'New-PatchBaseline -Server $destinationServer -Name $baseline.Name -Description $baseline.Description -Static -TargetType $baseline.TargetType -IncludePatch $includePatches'
    if ($baseline.IsExtension) {
    $command += ' -Extension'
      }
    
    Invoke-Expression $command
     }
    }
    
    function 
    CreateDynamicBaseline([VMware.VumAutomation.Types.Baseline]$baseline,[VMware.VimAutomation.Types.VIServer]$destinationServer)
    {
    if ($baseline.BaselineContentType -eq 'Dynamic'){
    $command = 'New-PatchBaseline -Server $destinationServer -Name $baseline.Name -Description $baseline.Description -TargetType $baseline.TargetType -Dynamic -SearchPatchStartDate $baseline.SearchPatchStartDate - SearchPatchEndDate $baseline.SearchPatchEndDate -SearchPatchProduct $baseline.SearchPatchProduct -SearchPatchSeverity $baseline.SearchPatchSeverity -SearchPatchVendor $baseline.SearchPatchVendor'
    } elseif ($baseline.BaselineContentType -eq 'Both'){
    		$includePatches = ExtractPatchesFromServer $baseline.InclPatches $destinationServer
    	$excludePatches = ExtractPatchesFromServer $baseline.ExclPatches $destinationServer
    
    $command = 'New-PatchBaseline -Server $destinationServer -Name $baseline.Name -Description $baseline.Description -TargetType $baseline.TargetType -Dynamic -SearchPatchStartDate $baseline.SearchPatchStartDate -SearchPatchEndDate $baseline.SearchPatchEndDate -SearchPatchProduct $baseline.SearchPatchProduct -SearchPatchSeverity $baseline.SearchPatchSeverity -SearchPatchVendor $baseline.SearchPatchVendor'
    if ($includePatches.Count -gt 0){
    $command += ' -IncludePatch $includePatches'
      }
    
    if ($excludePatches.Count -gt 0){
    $command += ' -ExcludePatch $excludePatches'
      }
     }
    
    #check for null because there is known issue for creating baseline with null SearchPatchPhrase
    if ($baseline.SearchPatchPhrase -ne $null){
    $command += ' -SearchPatchPhrase $baseline.SearchPatchPhrase'
     }
    
    Invoke-Expression $command
    }
    
    foreach ($destinationServer in $destinationServers) {
    if ($baselines -eq $null) {
    Write-Error "The baselines parameter is null"
    } else {
    foreach($baseline in $baselines){
    if ($baseline.GetType().FullName -eq 'VMware.VumAutomation.Types.PatchBaselineImpl'){
    Write-Host "Import '" $baseline.Name "' to the server $destinationServer" 
    if($baseline.BaselineContentType -eq 'Static'){
    CreateStaticBaseline $baseline $destinationServer
    } else {
    CreateDynamicBaseline $baseline $destinationServer
        }
    } else {
    Write-Warning -Message "Baseline '$($baseline.Name)' is not patch baseline and will be skipped."    
       }
      }
     }
    }
    

    您現已將經過測試的基準匯出至另一個 Update Manager 伺服器。

  8. 使用您匯出經過測試之修補程式基準的目的地 Update Manager 伺服器執行個體,將修補程式套用至 ESX/ESXi 主機。