[stable-2.7] Reboot - Fix errors when using Paramiko connection (#49002)

Different connection plugins return different data when throwing exceptions. The Paramiko connection plugin does not return a text sting, which caused an exception.

The ssh connection plugin returns multi-line errors, which makes the debug logs harder to read. Only return the last line in that case in order to make the logs more readable.

When experiencing a connection failure, reset the connection.

Add reset() to paramiko_ssh

Indicate thet conection state is False when running close(). This is needed by the ensure_connected() decorator to work properly.

Co-authored-by: Matt Martz <matt@sivel.net>
(cherry picked from commit 5eb7f5781e)

Co-authored-by: Sam Doran <sdoran@redhat.com>
pull/49500/head
Sam Doran 6 years ago committed by Toshio Kuratomi
parent 35d84ccc3a
commit a928ea4d93

@ -175,6 +175,11 @@ class ActionModule(ActionBase):
display.debug('%s: %s success' % (self._task.action, action_desc)) display.debug('%s: %s success' % (self._task.action, action_desc))
return return
except Exception as e: except Exception as e:
if isinstance(e, AnsibleConnectionFailure):
try:
self._connection.reset()
except AnsibleConnectionFailure:
pass
# Use exponential backoff with a max timout, plus a little bit of randomness # Use exponential backoff with a max timout, plus a little bit of randomness
random_int = random.randint(0, 1000) / 1000 random_int = random.randint(0, 1000) / 1000
fail_sleep = 2 ** fail_count + random_int fail_sleep = 2 ** fail_count + random_int
@ -182,8 +187,12 @@ class ActionModule(ActionBase):
fail_sleep = max_fail_sleep + random_int fail_sleep = max_fail_sleep + random_int
if action_desc: if action_desc:
try:
error = to_text(e).splitlines()[-1]
except TypeError as e:
error = to_text(e)
display.debug("{0}: {1} fail '{2}', retrying in {3:.4} seconds...".format(self._task.action, action_desc, display.debug("{0}: {1} fail '{2}', retrying in {3:.4} seconds...".format(self._task.action, action_desc,
to_text(e).splitlines()[-1], fail_sleep)) error, fail_sleep))
fail_count += 1 fail_count += 1
time.sleep(fail_sleep) time.sleep(fail_sleep)

@ -530,6 +530,10 @@ class Connection(ConnectionBase):
f.close() f.close()
def reset(self):
self.close()
self._connect()
def close(self): def close(self):
''' terminate the connection ''' ''' terminate the connection '''
@ -587,7 +591,7 @@ class Connection(ConnectionBase):
os.rename(tmp_keyfile.name, self.keyfile) os.rename(tmp_keyfile.name, self.keyfile)
except: except Exception:
# unable to save keys, including scenario when key was invalid # unable to save keys, including scenario when key was invalid
# and caught earlier # and caught earlier
@ -595,3 +599,4 @@ class Connection(ConnectionBase):
fcntl.lockf(KEY_LOCK, fcntl.LOCK_UN) fcntl.lockf(KEY_LOCK, fcntl.LOCK_UN)
self.ssh.close() self.ssh.close()
self._connected = False

Loading…
Cancel
Save