ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible] Window Server 2019 업데이트 자동화
    오픈소스 2022. 3. 29. 11:17

     개요

     작년에 공유했었던 [Ansible] Window Server 업데이트 자동화 를 그대로 사용하고 있었는데 WinSVR 2019 이후의 패치 파일에서 변화가 생기면서 기존의 YAML파일로는 사용이 불가하게 되었다. 기존에는 SSU와 Rollup이 각각의 파일로 배포되었었는데 정확한 버전은 알 수 없으나 필자가 금년도 Rollup을 사용했을 때, 한 파일안에 2개의 패치가 모두 들어가 있었다. 이에 배포된 패치 파일을 분리하여 각각 적용하는 방식으로 패치를 자동화하는 방식을 기술하고자 한다. 패치 파일의 형태가 어떤 식으로 바뀔지는 모르겠으나 상황에 따라 적절하게 사용하면 될 것으로 보인다.

     

     


     

     

     기존 패치파일 (SSU/Rollup 분리 형태)

     작년 포스팅을 할 시기인 2021년 03월자 WinSVR 2016의 패치파일을 보도록 하자. SSU는 KB5001078이고 Rollup은 KB5000803을 사용한다. MSU 파일을 MS 제공하는 패치를 위한 일종의 패키지로 4가지 요소를 포함한다.

    업데이트 패키지를 설명하는 Windows Update 메타 데이터

    패키지에 대한 업데이트 데이터를 저장하는 하나 이상의 CAB 파일

    MSU 파일의 내용을 설명하는 XML 파일

    wusa.exe에서 읽은 속성 파일

    그리고 실제 MSU 파일을 풀어보면 아래와 같은 구성이다.

    그림-1. 기존 분리된 KB 압축해제 결과화면

     

     신규 패치파일 (SSU/Rollup 병합 형태)

     병합된 파일은 WinSVR 2019의 2022년 2월 패치를 살펴보도록 하자. MS에서 제공하는 패치에 대한 설명문을 보면 병합된 패치에 대한 설명으로 아래와 같이 기재되어 있다. 전체 내용은 다음 URL을 참고하면 된다. (WinSVR 2019 2022년 2월 패치 설명문)

    그림-2. 병합된 KB 설명 내용

    구성 요소는 병합 전 형태와 동일하며, 하나의 CAB 파일이 추가된 것을 볼 수 있다.

     

     YAML 파일 수정

     그렇다면 YAML 파일에서는 이 파일을 어떻게 사용해야 할까. 안타깝게도 기존에 사용하던 win_hotfix 모듈에서는 하나의 CAB를 보도록 설계되어 있는지 다수의 CAB 파일이 들어있으면 아래와 같은 오류를 출력하면서 정상적으로 동작하지 않는다.

    ... _file = Join-Path -Path $extract_path -ChildPath $cab_source_filename
                                                         ~~~~~~~~~~~~~~~~~~~~
        CategoryInfo          : InvalidArgument: (:) [Join-Path], ParentContainsErrorRecordException
        FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.JoinPathCommand
    ScriptStackTrace:
    at Get-HotfixMetadataFromFile, <No file>: line 93
    at <ScriptBlock>, <No file>: line 202
    fatal: [default]: FAILED! => {
        "changed": false,
        "msg": "Unhandled exception while executing module: Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'ChildPath'. Specified method is not supported."
    }

    오류 내용만 보면 특정 파라미터값의 형태를 변환하는데 실패했다(?) 라는 내용인 것 같긴 한데 정확한 원인은 파악하지 못하였다. 쨌든 필자는 해당 문제에 대하여 기존 방식과는 다르게 아래 방식으로 대체하였다.

    Config 백업 → MSU 파일  배포 → MSU 파일 압축해제 → SSU / Rollup 패치 진행 → 재부팅

    그리고 YAML에서 수정한 부분은 아래와 같다. 기존의 2012/2016 Copy & Execute 구문 아래애 추가한 내용이다.

      - name: Copy PatchFile to Client (2019)
        win_copy:
           src: /etc/ansible/YAML/2019/
           dest: C:\AnsiblePM
        when: '"2019" in OS_Edition.stdout'
    
      - name: Expand 2019 PatchFile
        win_shell: |
            cmd /C "Expand -F:* C:\\AnsiblePM\{{ var_2019_patch_Total }} C:\\AnsiblePM"
        when: '"2019" in OS_Edition.stdout'
    
      - name: Execute 2019 Patch(SSU + Rollup)
        win_shell: |
            cmd /C "FOR /F %a in ('dir /B C:\AnsiblePM ^| findstr cab ^| findstr SSU') do (C:\Windows\System32\Dism.exe /Online /Add-Package /PackagePath:C:\AnsiblePM\%a)"
            cmd /C "FOR /F %b in ('dir /B C:\AnsiblePM ^| findstr cab ^| findstr {{ var_2019_patch_Total.split('.').0 }}') do (C:\Windows\System32\Dism.exe /Online /Add-Package /PackagePath:C:\AnsiblePM\%b)"
        when: '"2019" in OS_Edition.stdout'

    압축해제에는 WINDOW 기본 명령어인 Expand를 사용하도록 한다. 사옹하면 내가 원하는 위치에 압축이 해제되며,

    'SSU*.msu' 와 같은 형식으로 사용해보았으나 정상적으로 입력되지 않았다. 결국 전체 파일 이름에서 KB이름을 추출하여 패치에 사용하는 식으로 YAML 파일을 작성하였다. 정상 적용 여부를 체크하는 파일도 정상적으로 동작할 수 있도록 수정하였으니 아래 첨부된 파일들을 사용하면 되겠다.

    AutoPM_Total_v2.yml
    0.00MB
    AutoPM_CheckPatch_v2.yml
    0.00MB

     


     

     

     마무리

     기존 방식과 달라진 부분이 있기는 하지만 그래도 편의적인 부분에서는 역시 부정할 수 없는 듯 하다. OS 버전이 올라감에 따라 새로운 문제가 계속해서 나오겠지만 ... 필자가 찾은 방안들은 계속해서 공유할테니 같은 문제는 겪고 있는 사람들에게 도움이 되었으면 한다.

    궁금하신 내용은 댓글로 남겨주시고, 많은 블로그 방문은 저에게 큰 힘이 됩니다. ・ᴥ・ 

     

    댓글

Designed by Tistory.