Ansible Windows 部署 - “连接已中止。”,错误(104,“连接已被对等方重置”)

Dev*_*ice 10 winrm ansible jenkins-pipeline

我在使用 Ansible 在 Windows 2008 服务器上进行部署时遇到问题。我有一个詹金斯管道,它有一个 Ansible 部署阶段,其中我将文件从清单中放到目标服务器上。我已经能够在相当多的服务器上成功地做到这一点。但是对于某些服务器,我看到上述错误消息。

这是詹金斯管道的输出

TASK [debug] *******************************************************************
ok: [ch3dw026394.mydomain.com] => {
    "msg": "Hello world!"
}

TASK [Testing connection to windows] *******************************************
fatal: [ch3dw026394.mydomain.com]: UNREACHABLE! => {"changed": false, "msg": "ntlm: ('Connection aborted.', error(104, 'Connection reset by peer'))", "unreachable": true}
Run Code Online (Sandbox Code Playgroud)

这是 win_ping 的 Ansible playbook 模块

  #Testing connection with Target
  - debug: 
    msg: "Testing connection to windows {{ inventory_hostname }}"

  - name: Testing connection to windows
    win_ping: null
    any_errors_fatal: true
Run Code Online (Sandbox Code Playgroud)

我对此做了很多研究,但以下选项均无效

  1. 关闭 Windows 2008 服务器上的 UAC。

  2. 不起作用 网上有些帖子说发生这个错误是因为清单文件不包含 FQDN,而是包含 IP。我的清单文件包含 FQDN(完全限定域名),但仍然不起作用另一篇文章说 vars.yml 中的端口号(5986)应该被注释掉,并在清单文件中包含主机名:5986。还是没起作用

  3. 我尝试删除服务器上的侦听器并运行 powershell 脚本以启用 WinRM ( https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 )。这也行不通。使用删除监听器

    winrm delete winrm/config/Listener?Address=*+Transport=HTTP
    winrm delete winrm/config/Listener?Address=*+Transport=HTTS
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将 WinRM 设置为具有基本 Auth = true 和AllowUncrypted = true(见下文),但仍然不起作用。(请注意,我不需要在其他 Windows 2008 服务器中执行任何此操作,并且工作得非常好)。

    winrm set winrm/config/service '@{AllowUnencrypted= "true"}'
    Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" -Value $true
    
    Run Code Online (Sandbox Code Playgroud)

请你帮我解决这个错误。

提前感谢你的帮助!温暖的问候

Dev*_*ice 1

好吧,伙计们,对于那些想知道这个问题是否已修复的人来说,答案是肯定的,我已经成功了。但是,我不确定这是否是正确的方法。

因此,这里是如何解决此错误的解决方法:

该问题是由于 TLS 1.2 注册表设置造成的。

  • 于是进入注册表编辑器(regedit),遍历到以下位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

  • 检查是否有 TLS 1.2 的条目。如果是,则将其删除。现在再次尝试部署,它应该可以工作!

正如我所说,这是一种解决方法。如果需要存在 TLS 1.2,则需要从 Ansible 剧本的角度进行更深入的研究。