在Ansible剧本中使用Windows主机时,我遇到了一些开关问题。我正在运行安装了pywinrm 0.2.2的Ansible 2.3。我正在使用本地管理员用户的基本身份验证。

有时,当我运行任务时会收到此问题:

 [WARNING]: FATAL ERROR DURING FILE TRANSFER: Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py", line 267, in _winrm_exec
  self._winrm_send_input(self.protocol, self.shell_id, command_id, data, eof=is_last)
File "/usr/local/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py", line 248, in _winrm_send_input
  protocol.send_message(xmltodict.unparse(rq))
File "/usr/local/lib/python2.7/dist-packages/winrm/protocol.py", line 207, in send_message
   return self.transport.send_message(message)
File "/usr/local/lib/python2.7/dist-packages/winrm/transport.py", line 191, in send_message
   raise WinRMTransportError('http', error_message) WinRMTransportError: (u'http', u'Bad HTTP response returned from server. Code 500')


其他时候,当我尝试在某个任务上运行win_shell/win_command/raw modulewith_items时一组Windows主机似乎在Ansible创建的临时文件上失败。

我要运行的任务是:

- name: Check services up
  win_command: 'sc queryex {{ item }} | Findstr RUNNING'
  with_items: '{{ component_services }}'
  register: command_result
  ignore_errors: yes


我可能会得到的错误是:

changed: [172.16.104.169] => (item=Dnscache)
failed: [172.16.104.176] (item=Dnscache) => {"failed": true, "item": "Dnscache", 
  "module_stderr": "Exception calling \"Run\" with \"1\" argument(s): \"Exception calling \"Invoke\" with \r\n\"0\" 
     argument(s): \"The running command stopped because 
           the preference variable \r\n\"ErrorActionPreference\" 
           or common parameter is set to 
   Stop: (0) : cannot open \r\nC:\Users\ADMINI~1\AppData\Local\Temp\RESB3FF.tmp 
  for writing\r\n(1) : 
     using System;\r\n\"\"\r\nAt line:45 char:1\r\n+ 
     $output = $entrypoint.Run($payload)\r\n+ 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n+ 
  CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordE \r\nxception\r\n+ 
  FullyQualifiedErrorId : ScriptMethodRuntimeException\r\n", 
  "module_stdout": "", "msg": "MODULE FAILURE", "rc": 1}
     changed: [172.16.104.141] => (item=Dnscache)
     changed: [172.16.104.168] => (item=Dnscache)
     changed: [172.16.104.145] => (item=Dnscache)


两个问题都是绝对随机的,甚至在一系列不同的运行中甚至根本不会出现。

有任何帮助吗?

评论

您再次在该主机上运行了多少个项目,在执行特定主机上有多个项目的ansible循环时,随机winrm 500 erros出现了问题。您也无法同时找到它吗?

4个或更多..我恐怕还没有解决的办法:(

#1 楼

您可能应该为此创建一个Ansible问题,因为它很可能是Ansible中的错误。

第一个错误使我想到了WinRM流水线技术:


Ansible 2.3 .0引入了始终在线的WinRM流水线功能(类似于SSH流水线),这可能是在此之后。
SSH管道传输可能会在Linux的Ansible中引起问题,并且将其关闭可能很有用,但是对于WinRM管道传输尚无法实现。

此相关问题包括一些Git提交它将在将来的版本中重新启用“非流水线”模式(现在应该在2.4中发布,可能在2.3.2中带有反向端口-请参阅此评论)

尝试升级到Ansible 2.4.1+(通常效果很好)以获取修复。或者尝试降级到Ansible 2.2.3以查看是否有帮助-这将禁用WinRM流水线操作,并可以避免该区域的其他回归错误。


如果使用pip安装了Ansible,则可以执行pip install ansible==2.4.1
ansible==2.2.3 进行降级),然后如果这样做没有帮助,请对2.3.1进行相同的操作以再次升级。
您还应按照上述问题中的说明升级到最新的pywinrm


#2 楼

我发现Ansible 2.3.2是最稳定的,因此我还没有花太多时间在2.4.1上。对于Winrm,2.4.0无疑存在一些稳定性问题。