From b97caade8a625e749e370a38fc6f0ca70defe268 Mon Sep 17 00:00:00 2001 From: Simon Westphahl Date: Thu, 14 Feb 2019 21:43:24 +0100 Subject: [PATCH] Backport: Raise AnsibleConnectionError on winrm connnection errors (#52227) * Raise AnsibleConnectionError on winrm con errors Currently all uncaught exceptions of the requests library that is used in winrm will lead to an "Unexpected failure during module execution". Instead of letting all exceptions bubble up we catch the connection related errors (inkl. timeouts) and re-raise them as AnsibleConnectionError so Ansible will mark the host as unreachable and exit with the correct return code. This is especially important for Zuul (https://zuul-ci.org) to distinguish between failures and connection/host related errors. * Update lib/ansible/plugins/connection/winrm.py Co-Authored-By: westphahl * Add changelog fragment --- changelogs/fragments/winrm-ansible-conn-error.yaml | 3 +++ lib/ansible/plugins/connection/winrm.py | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 changelogs/fragments/winrm-ansible-conn-error.yaml diff --git a/changelogs/fragments/winrm-ansible-conn-error.yaml b/changelogs/fragments/winrm-ansible-conn-error.yaml new file mode 100644 index 00000000000..d5df68c75ec --- /dev/null +++ b/changelogs/fragments/winrm-ansible-conn-error.yaml @@ -0,0 +1,3 @@ +--- +minor_changes: + - Raise AnsibleConnectionError on winrm connnection errors diff --git a/lib/ansible/plugins/connection/winrm.py b/lib/ansible/plugins/connection/winrm.py index 2d43c5f916a..55fb2dbfee7 100644 --- a/lib/ansible/plugins/connection/winrm.py +++ b/lib/ansible/plugins/connection/winrm.py @@ -134,6 +134,7 @@ try: import winrm from winrm import Response from winrm.protocol import Protocol + import requests.exceptions HAS_WINRM = True except ImportError as e: HAS_WINRM = False @@ -479,6 +480,8 @@ class Connection(ConnectionBase): raise AnsibleError('winrm send_input failed; \nstdout: %s\nstderr %s' % (to_native(response.std_out), to_native(stderr))) return response + except requests.exceptions.ConnectionError as exc: + raise AnsibleConnectionFailure('winrm connection error: %s' % to_native(exc)) finally: if command_id: self.protocol.cleanup_command(self.shell_id, command_id)