使用os_server模块和本地连接时,“winrm send_input failed”

时间:2018-01-09 09:23:18

标签: ansible openstack winrm

我正在尝试为Windows VM编写一个剧本,该剧本也使用os_server模块创建VM。 我从一个简单的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_server任务:

- 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-playbook site.yml --inventory=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。从任务中删除connection: local会带来与上面相同的结果。 我希望任务返回一个简单的“ok”,因为VM已经存在。 我在这里缺少什么?

更新2018-01-09,格林威治标准时间9:45:

所以我尝试了另一个实验:我从var文件中删除了所有ansible_*变量(见下文),以便在没有配置WinRM连接时查看Ansible对os_server任务的作用。这次我使用ansible-playbook site.yml --inventory=10.204.0.9, -vvv再次运行os_server任务:

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_server任务已成功完成。但当然,这不是答案,因为我需要为Windows VM配置WinRM连接。

更新2018-01-09,10:00 GMT:

根据建议将gather_facts: false添加到游戏并运行ansible-playbook site.yml --inventory=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连接。

完整Playbook(site.yml,已添加gather_facts: 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_vars / all中的Vars(在所有示例中都使用):

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]

1 个答案:

答案 0 :(得分:0)

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