Ansible Windows 更新 - 除非执行交互式登录,否则将失败

Ansible Windows 更新 - 除非执行交互式登录,否则将失败

很久以前/第一次...使用官方 AWS Windows 2019 AMI(“us-east-1” 上的“ami-0229f7666f517b31e”),我们启动一个新实例并通过 PowerShell 执行一些基本任务(使用“user_data”选项):

  • 开始记录
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 剧本,它可以执行一些操作(配置服务、加入域、安装 chocolatey 等),但总是失败的任务是 Windows 更新部分。

在故障排除过程中,我们从 Ansible playbook 中删除了所有内容,除了使用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 Store 注册表项、重新启动 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 登录,然后我不接受任何提示或单击任何内容。

显然,目标是实现无需手动登录,因为这违背了该项目的主要目的。所以我的问题是:

  • 有人知道发生了什么事吗?!?有没有办法模拟/复制交互式登录执行的任何更改?我仔细检查了日志,但没有发现任何明显的东西。
  • 假设我无法以“正确”的方式修复它,关于如何使用 Ansible 执行交互式登录,有什么想法吗?我正在考虑有一个交互式登录的任务,然后另一个注销的任务……很乱,但不能一直浪费时间在这上面。“user_data”调整也可以。

愿意尝试任何方法,我唯一能说的是,我们无法更改正在使用的 AMI(除了将其更新到最新版本),并且需要实现“user_data”过程的最终结果(但如果这是问题所在,也可以通过其他方式完成)。其中涉及代理,但我看不出这是一个因素,因为问题的根源似乎是交互式登录。

答案1

我以前遇到过这个问题。不确定如何修复,但解决方法是为 ansible 用户配置自动登录。重新启动实例。运行更新,然后删除自动登录。

解决方法非常糟糕,我的是 Packer 图像创建的一部分,所以我只能添加自动登录,然后在更新后将其删除。

答案2

fwiw,我已经就此打开了一个错误报告:

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

相关内容