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 playbook,它會執行一些操作(設定服務、加入網域、安裝 Chocolatey 等),但永遠失敗的任務是 Windows 更新部分。

在故障排除過程中,除了使用ansible.windows收藏。此時,執行個體已部署,基本 PowerShell 任務透過「user_data」運行,然後 Ansible 連線並嘗試執行 Windows Update。

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、Ran wsreset.exe、刪除 Windows 應用程式商店註冊表項、重新啟動 Windows 更新服務等)...但我唯一能看到的是只要我在Windows 更新嘗試運行之前以互動方式登入一次,一切都很好。

但顯然我們不想這樣做;)

再次明確:

  • 部署執行個體(使用「user_data」調整 - 包含重新啟動),執行執行 Windows Update 任務的 Ansible playbook:
Failed to search for updates: Exception from HRESULT: 0x80240438
  • 部署實例(使用「user_data」調整 - 包含重新啟動)、互動登入(使用 RDP)、執行執行 Windows 更新任務的 Ansible playbook:
Security Intelligence Update for Microsoft Defender Antivirus - KB2267602 (Version 1.329.1737.0)

筆記:這只是當前的回應,因為 AMI 僅缺少該更新...因此將來可能/應該改變

另外,這不包括任何網域加入或任何東西......儘管我注意到那裡有類似的模式。如果我使用完整的 playbook,只要在 Windows Update 任務運行之前使用網域使用者以互動方式登錄,它就可以運作。

應該要提到的是,當我以互動方式登入時,我什麼也沒做...只需透過 RDP 登錄,然後我不接受任何提示或點擊任何內容。

顯然,我們的目標是不需要手動登錄,因為這違背了該專案的主要目的。所以我的問題是:

  • 有人知道WTF 正在發生嗎?有沒有辦法模擬/複製互動式登入執行的任何變更?我已經搜索過日誌,但沒有看到任何明顯的東西。
  • 假設我無法以「正確」的方式修復它,那麼關於如何使用 Ansible 執行互動式登入有什麼想法嗎?我在想有一個互動式登入的任務,然後有另一個將其註銷的任務......很混亂,但不能繼續在這上面浪費時間。 “user_data”調整也可以。

此時願意嘗試任何事情,我唯一能說的是我們無法更改正在使用的 AMI(除了將其更新到最新版本),並且需要實現“user_data”過程的最終結果(但如果這是問題的話,可以通過其他方式完成)。涉及到一個代理,但我不明白這是一個因素,因為問題的根源似乎是互動式登入。

答案1

我以前也遇到過這個問題。不確定修復,但解決方法是為 ansible 使用者配置自動登入。重新啟動實例。執行更新,然後刪除自動登入。

非常糟糕的工作,我的工作是 Packer 映像創建的一部分,所以我可以添加自動登錄,然後在更新後將其刪除。

答案2

fwiw,我已經就此開啟了一個錯誤報告:

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

相關內容