Ansible Windows 업데이트 - 대화형 로그인을 수행하지 않으면 실패함

Ansible Windows 업데이트 - 대화형 로그인을 수행하지 않으면 실패함

오랜 시간/처음... 공식 AWS Windows 2019 AMI("us-east-1"의 "ami-0229f7666f517b31e")를 사용하여 새 인스턴스를 가동하고 몇 가지 기본 작업을 수행합니다("user_data" 옵션 사용). PowerShell을 통해:

  • 로깅 시작
Start-Transcript -Path "c:\user-data.txt"
  • 로컬 "관리자" 비밀번호 변경:
$admin = [adsi]("WinNT://./administrator, user")
$admin.PSBase.Invoke("SetPassword", "${password}")
  • Ansible용 WinRM 활성화/구성:
$WinRM = Invoke-WebRequest -Proxy http://"${proxy}" -UseBasicParsing https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 | Select-Object -ExpandProperty Content
Invoke-Expression $WinRM
  • RDP 활성화:
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -name "fDenyTSConnections" -value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
  • 호스트 이름 구성:
Rename-Computer -NewName "${name}" -Force
  • 로깅 중지:
Stop-Transcript
  • 컴퓨터 재부팅(호스트 이름 변경이 적용됨):
Restart-Computer

매우 기본적인 내용입니다. 여기서는 문제가 될 만한 것이 없으며 각 작업이 예상대로 작동하는지 확인했습니다.

이 시점에서 우리는 몇 가지 작업(서비스 구성, 도메인 가입, 초콜릿 설치 등)을 수행하는 Ansible 플레이북을 실행하지만 항상 실패하는 작업은 Windows 업데이트 부분입니다.

문제 해결 과정에서 우리는 다음을 사용하여 Windows 업데이트를 호출하는 것 외에 Ansible 플레이북에서 모든 것을 제거했습니다.ansible.windows수집. 따라서 이 시점에서 인스턴스가 배포되고 기본 PowerShell 작업이 "user_data"를 통해 실행된 다음 Ansible이 연결되어 Windows 업데이트 실행을 시도합니다.

Ansible 작업 자체도 매우 기본적입니다.

- name: os - perform windows updates
  win_updates:
    state: installed
    category_names:
    - Application
    - Connectors
    - CriticalUpdates
    - DefinitionUpdates
    - DeveloperKits
    - FeaturePacks
    - Guidance
    - SecurityUpdates
    - ServicePacks
    - Tools
    - UpdateRollups
    log_path: c:\wu-install.log
    reboot: yes
    reboot_timeout: 600

그래서 이것이 이상하고 짜증나는 부분입니다... 우리가 그것을 실행하면 다음과 같은 응답을 보게 됩니다:

Failed to search for updates: Exception from HRESULT: 0x80240438

원하는 작업 흐름을 사용하여 시도할 때마다 이런 일이 발생합니다. 하지만 Windows 업데이트 작업이 수행되기 전에 대화형으로 한 번만 실행하면 작동한다는 사실을 발견했습니다! 매번!!!

내 마지막 작업은 99.9% Linux였으므로 이에 대해 약간 녹슬었지만 처음(대화형) 로그인 시 발생하는 미친/문서화되지 않은 일이 있다는 것을 알고 있습니다. 그리고 해당 오류 코드를 조사한 결과 수많은 다른 작업(IPv6 비활성화, wsreset.exe 실행, Windows 스토어 레지스트리 항목 삭제, Windows 업데이트 서비스 다시 시작 등)을 시도했지만... 그러나 내가 볼 수 있는 유일한 것은 Windows 업데이트 시도가 실행되기 전에 대화형으로 한 번만 로그인하면 모든 것이 정상입니다.

하지만 분명히 우리는 그렇게 하고 싶지 않습니다. ;)

다시 한 번 분명히 말씀드리자면:

  • 인스턴스 배포("user_data" 조정 - 재부팅 포함), Windows 업데이트 작업을 실행하는 Ansible 플레이북을 실행합니다.
Failed to search for updates: Exception from HRESULT: 0x80240438
  • 인스턴스 배포("user_data" 조정 - 재부팅 포함), 대화형으로 로그인(RDP 사용), Windows 업데이트 작업을 실행하는 Ansible 플레이북 실행:
Security Intelligence Update for Microsoft Defender Antivirus - KB2267602 (Version 1.329.1737.0)

메모:AMI에는 해당 업데이트만 없기 때문에 이는 현재 응답일 뿐입니다. 따라서 향후에는 변경될 수 있거나 변경되어야 합니다.

또한 여기에는 도메인 가입 등이 포함되지 않습니다. 거기에서도 비슷한 패턴을 발견했지만. 전체 플레이북을 사용한 경우 Windows 업데이트 작업을 실행하기 전에 도메인 사용자를 사용하여 대화형으로 로그인하면 제대로 작동했습니다.

대화형으로 로그인할 때 아무 것도 하지 않는다는 점을 언급해야 합니다. RDP를 통해 로그인하면 프롬프트를 수락하거나 아무 것도 클릭하지 않습니다.

분명히 목표는 수동 로그인이 필요하지 않도록 만드는 것입니다. 이는 이 프로젝트의 주요 목적을 무너뜨리기 때문입니다. 그래서 내 질문은 다음과 같습니다

  • WTF가 일어나고 있다는 것을 아는 사람이 있습니까?!? 대화형 로그인 수행에 따른 변경 사항을 시뮬레이션/복제할 수 있는 방법이 있습니까? 로그를 샅샅이 뒤졌지만 명백한 내용은 보이지 않습니다.
  • "올바른" 방법으로 문제를 해결할 수 없다고 가정하면 Ansible을 사용하여 대화형 로그인을 수행하는 방법에 대한 아이디어가 있습니까? 대화형으로 로그인하는 작업이 있고 로그아웃되는 또 다른 작업이 있을 것 같아요... 지저분하지만 계속해서 시간을 낭비할 수는 없습니다. "user_data" 조정도 작동합니다.

이 시점에서 무엇이든 시도해 보고 싶은데, 제가 말할 수 있는 유일한 것은 사용 중인 AMI를 변경할 수 없으며(최신 릴리스로 업데이트하는 것 외에는) "user_data" 프로세스의 최종 결과를 달성해야 한다는 것입니다. (그러나 그것이 문제인 경우 다른 방법으로 수행할 수 있습니다). 관련 프록시가 있지만 문제의 원인이 대화형으로 로그인하는 것 같기 때문에 이것이 어떤 요인인지 알 수 없습니다.

답변1

나는 전에이 문제를 겪었습니다. 수정 사항은 확실하지 않지만 해결 방법은 ansible 사용자에 대해 자동 로그인을 구성하는 것이었습니다. 인스턴스를 재부팅합니다. 업데이트를 실행한 다음 자동 로그인을 제거하십시오.

해결 방법이 매우 나빴습니다. 제 것은 Packer 이미지 생성의 일부였기 때문에 자동 로그인을 추가한 다음 업데이트 후에 제거할 수 있었습니다.

답변2

fwiw, 이에 대한 버그 보고서를 열었습니다.

https://github.com/ansible-collections/ansible.windows/issues/193

관련 정보