使用 Vagrant 配置 Windows VM 无法执行远程 WinRM 命令

Posted

技术标签:

【中文标题】使用 Vagrant 配置 Windows VM 无法执行远程 WinRM 命令【英文标题】:Provisioning Windows VM with Vagrant cannot execute remote WinRM commands 【发布时间】:2021-11-27 14:37:12 【问题描述】:

我正在尝试在现有的 Vagrant 机器上安装一些基本工具,但我的 shell 命令失败,因为 Vagrant 无法执行 WinRM 命令。

我得到以下输出:

❯ vagrant up --provider vmware_workstation
Bringing machine 'default' up with 'vmware_workstation' provider...
==> default: Cloning VMware VM: 'StefanScherer/windows_2019'. This can take some time...
==> default: Verifying vmnet devices are healthy...
==> default: Preparing network adapters...
==> default: Fixed port collision for 3389 => 3389. Now on port 2200.
==> default: Starting the VMware VM...
==> default: Waiting for the VM to receive an address...
==> default: Forwarding ports...
    default: -- 3389 => 2200
    default: -- 5985 => 55985
    default: -- 5986 => 55986
    default: -- 22 => 2222
==> default: Waiting for machine to boot. This may take a few minutes...
    default: WinRM address: 127.0.0.1:55985
    default: WinRM username: vagrant
    default: WinRM execution_time_limit: PT2H
    default: WinRM transport: negotiate
An error occurred executing a remote WinRM command.

Shell: Cmd
Command: hostname
Message: [WSMAN ERROR CODE: 2147942421]: <f:WSManFault Code='2147942421' Machine='127.0.0.1' xmlns:f='http://schemas.microsoft.com/wbem/wsman/1/wsmanfault'><f:Message><f:ProviderFault path='%systemroot%\system32\winrscmd.dll' provider='Shell cmd plugin'>The device is not ready. </f:ProviderFault></f:Message></f:WSManFault>

当我查看虚拟机时,它会打开“你想信任这个网络吗”弹出窗口。当我遵循该过程并接受提示时,配置将按预期继续,但我真的不想等待 Windows 出现并单击按钮。有没有办法实现自动化?

这是我正在使用的 Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "StefanScherer/windows_2019"

  # Setup environment.
  config.vm.provision "shell", path: "provision.ps1"
  # PowerShell must be reloaded, so we'll open up a new instance.
  config.vm.provision "shell", inline: "choco feature enable -n allowGlobalConfirmation"
  config.vm.provision "shell", inline: "choco install firefox azure-cli terraform"

  config.vm.provider "vmware_workstation" do |v|
    v.gui = true
  end
end

【问题讨论】:

【参考方案1】:

没关系。经过更多测试后,我发现我只需要增加 Vagrantfile 中 WinRM 连接的重试次数:

config.winrm.max_tries = 300 # default is 20
config.winrm.retry_delay = 2 #seconds. This is the defaul value and just here for documentation.

这会将超时设置为 10 分钟,这在我的机器上足以启动 Windows VM。然而,默认的 40 秒通常是不够的,有时只能正确配置我的虚拟机。

希望这对任何人都有帮助。

【讨论】:

以上是关于使用 Vagrant 配置 Windows VM 无法执行远程 WinRM 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何控制 Vagrant 用于配置 VM 的 Chef 版本?

获取在 Vagrant VM 上运行的 LAMP 堆栈(在 Windows 7 主机下),完整说明?

vagrant 中的 JS 和 CSS 文件在 VM 之外保存时未正确编码

仅在一个Vagrant VM中管理许多PhpStorm项目

(虚拟机)VM 内的 ls /vagrant 挂起

vagrant怎么配置iso文件系统