패치 또는 확장을 ESX/ESXi 호스트에 적용하기 전에 테스트 환경에서 호스트에 적용하여 패치 및 확장을 테스트할 수 있습니다. 그런 다음 Update Manager PowerCLI를 사용하여 테스트된 기준선을 다른 Update Manager 서버 인스턴스로 내보내고 패치 및 확장을 다른 호스트에 적용할 수 있습니다.

Update Manager PowerCLI는 Windows PowerShell 기반의 명령줄 및 스크립팅 도구이며 Update Manager 관리 및 자동화를 위한 cmdlets 집합을 제공합니다. 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 Client 준수 보기에 표시되는 검색 결과를 검토합니다.

    검색 결과를 보기 위한 자세한 절차와 규정 준수 상태에 대한 자세한 내용은 vSphere 개체에 대한 검색 결과 및 규정 준수 상태 보기를 참조하십시오.

  5. (선택 사항) 연결된 기준선의 패치를 업데이트하려는 호스트에 스테이징합니다.

    적용하기 전에 Update Manager 서버의 패치를 호스트에 스테이징 및 복사할 수 있습니다. 패치를 스테이징하면 업데이트 적용 프로세스가 빨라지고 업데이트를 적용하는 동안 호스트 다운타임이 최소화됩니다. 패치 및 확장을 호스트에 스테이징하는 방법에 대한 자세한 절차는 ESX/ESXi 호스트에 패치 및 확장 스테이징을 참조하십시오.

  6. 컨테이너 개체에 업데이트를 적용합니다.

    비준수 상태인 호스트에 업데이트를 적용하여 연결된 기준선을 준수하도록 합니다. 패치 또는 확장 기준선에 기반하여 호스트의 업데이트를 적용하는 방법은 패치 또는 확장 기준선에 기반하여 호스트에 업데이트 적용을 참조하십시오.

  7. 패치를 테스트하는 데 사용한 Update Manager 서버에서 패치 기준선을 내보내고 이를 다른 Update Manager 서버로 가져옵니다.

    Update Manager PowerCLI 스크립트를 사용하여 하나의 Update Manager 서버에서 다른 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 호스트에 적용하십시오.