代码之家  ›  专栏  ›  技术社区  ›  Jim Holden

使用os\U服务器模块和本地连接时获取“winrm send\u input failed”

  •  0
  • Jim Holden  · 技术社区  · 7 年前

    我正在尝试为Windows虚拟机编写一个剧本,该剧本还使用 os_server 单元 我从一个简单的 win_ping ,假设VM已经存在:

    - name: Create instance
      hosts: all
      tasks:
        - name: Ping machine
          win_ping:
    

    使用运行它 ansible-playbook site.yml --inventory=10.204.0.9, 结果如下:

    PLAY [Create instance] ************************************************************************
    
    TASK [Gathering Facts] ************************************************************************
    ok: [10.204.0.9]
    
    TASK [Ping machine] ***************************************************************************
    ok: [10.204.0.9]
    
    PLAY RECAP ************************************************************************************
    10.204.0.9                 : ok=2    changed=0    unreachable=0    failed=0   
    

    现在我添加 os\U服务器 任务:

    - name: Create Windows Instance
      connection: local
      os_server:
        state: present
        region_name: "{{ os_region_name }}"
        auth: "{{ cloud.auth }}"
        name: "windows-{{ inventory_hostname }}"
        image: Windows 2012 R2 Datacenter
        key_name: vector_ops
        flavor: 1C-2GB-50GB
        floating_ips:
          - "{{ inventory_hostname }}"
    - name: Ping machine
      win_ping:
    

    我正在设置 connection local 因为我希望从控制机器执行此任务,以防VM尚未创建。

    当我再次使用 ansible剧本网站。yml——库存=10.204.0.9, ,我得到:

    TASK [Create Windows Instance] ****************************************************************
     [WARNING]: FATAL ERROR DURING FILE TRANSFER: Traceback (most recent call last):   File
    "/usr/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py", line 276, in
    _winrm_exec     self._winrm_send_input(self.protocol, self.shell_id, command_id, data,
    eof=is_last)   File "/usr/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py",
    line 256, 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 202, in send_message     raise WinRMTransportError('http',
    error_message) WinRMTransportError: (u'http', u'Bad HTTP response returned from server. Code
    500')
    
    fatal: [10.204.0.9]: FAILED! => {"msg": "winrm send_input failed"}
    

    我有点困惑为什么在文件传输过程中会出现错误,所以我使用 -vvv :

    TASK [Create Windows Instance] ****************************************************************
    task path: /home/ubuntu/basic-windows-example/trunk/playbooks/site.yml:8
    Using module file /usr/lib/python2.7/dist-packages/ansible/modules/cloud/openstack/os_server.py
    <10.204.0.9> ESTABLISH WINRM CONNECTION FOR USER: Admin on PORT 5986 TO 10.204.0.9
    EXEC (via pipeline wrapper)
    

    事实上,Ansible似乎试图建立winrm连接,尽管 connection: local . 正在删除 连接:本地 从任务中得到与上述相同的结果。 我希望任务返回一个简单的“ok”,因为VM已经存在了。 我错过了什么?

    更新时间:2018-01-09,格林尼治时间9:45:

    所以我尝试了另一个实验:我把所有的 ansible_* var文件中的变量(请参见下文),以查看Ansible对 os\U服务器 未配置WinRM连接时的任务。使用再次运行 ansible-playbook site.yml --inventory=10.204.0.9, -vvv 这次我得到了 os\U服务器 任务:

    TASK [Create Windows Instance] ****************************************************************
    task path: /home/ubuntu/basic-windows-example/trunk/playbooks/site.yml:9
    Using module file /usr/lib/python2.7/dist-packages/ansible/modules/cloud/openstack/os_server.py
    <10.204.0.9> ESTABLISH LOCAL CONNECTION FOR USER: ubuntu
    <10.204.0.9> EXEC /bin/sh -c 'echo ~ && sleep 0'
    <10.204.0.9> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/ubuntu/.ansible/tmp/ansible-tmp-1515490597.4-208015762064624 `" && echo ansible-tmp-1515490597.4-208015762064624="` echo /home/ubuntu/.ansible/tmp/ansible-tmp-1515490597.4-208015762064624 `" ) && sleep 0'
    <rest cut off for brevity>
    

    因此,现在确实建立了本地连接 os\U服务器 任务成功完成。但当然,这不是答案,因为我需要为Windows VM配置WinRM连接。

    更新时间:2018-01-09,格林尼治时间10:00:

    按照建议添加 gather_facts: false 比赛和跑步 ansible剧本网站。yml——库存=10.204.0.9, ,我现在得到:

    PLAY [Create instance] ************************************************************************
    META: ran handlers
    
    TASK [Create Windows Instance] ****************************************************************
    task path: /home/ubuntu/basic-windows-example/trunk/playbooks/site.yml:10
    Using module file /usr/lib/python2.7/dist-packages/ansible/modules/cloud/openstack/os_server.py
    <10.204.0.9> ESTABLISH WINRM CONNECTION FOR USER: Admin on PORT 5986 TO 10.204.0.9
    EXEC (via pipeline wrapper)
     [WARNING]: FATAL ERROR DURING FILE TRANSFER: Traceback (most recent call last):   File
    "/usr/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py", line 276, in
    _winrm_exec     self._winrm_send_input(self.protocol, self.shell_id, command_id, data,
    eof=is_last)   File "/usr/lib/python2.7/dist-packages/ansible/plugins/connection/winrm.py",
    line 256, 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 202, in send_message     raise WinRMTransportError('http',
    error_message) WinRMTransportError: (u'http', u'Bad HTTP response returned from server. Code
    500')
    
    fatal: [10.204.0.9]: FAILED! => {
        "msg": "winrm send_input failed"
    }
    

    错误是相同的,Ansible仍尝试建立WinRM连接。

    完整剧本(site.yml,新增 gather\u事实:false ):

    - name: Create instance
      hosts: all
      gather_facts: false
      tasks:
        - name: Create Windows Instance
          connection: local
          os_server:
            state: present
            region_name: Region1
            auth: "{{ cloud.auth }}"
            name: "windows-{{ inventory_hostname }}"
            image: Windows 2012 R2 Datacenter
            key_name: mykey
            flavor: 1C-2GB-50GB
            floating_ips:
              - "{{ inventory_hostname }}"
        - name: Ping machine
          win_ping:
    

    group\u Vars/all中的VAR(在所有示例中使用):

    cloud:
      auth:
        auth_url: https://cloud.internal:5000/v3/
        domain_name: Domain_01
        password: mypassword
        project_name: dev-project
        username: apiuser
    os_region_name: Fra1
    ansible_user: Admin
    ansible_port: 5986
    ansible_password: myvmpassword
    ansible_connection: winrm
    ansible_winrm_server_cert_validation: ignore
    

    版本信息:

    ansible --version
    ansible 2.4.2.0
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/home/ubuntu/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/dist-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.12 (default, Nov 20 2017, 18:23:56) [GCC 5.4.0 20160609]
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Jim Holden    7 年前

    如果我使用 delegate_to: localhost 而不是 connection: local 对于 os_server 任务中,确实建立了本地连接。 delegate_to 避免加载该连接的WinRM连接变量。

        2
  •  0
  •   β.εηοιτ.βε grigorevp    3 年前

    如果其他人在Ansible上遇到同样的问题,请检查主机上的WinRM内存设置,确保它有足够的内存。

    Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB 1024