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>
This commit is contained in:
parent
d4568d97d4
commit
5eb7f5781e
2 changed files with 16 additions and 2 deletions
|
@ -171,6 +171,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
|
||||||
|
@ -178,8 +183,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)
|
||||||
|
|
||||||
|
|
|
@ -528,6 +528,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 '''
|
||||||
|
|
||||||
|
@ -585,7 +589,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
|
||||||
|
@ -593,3 +597,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…
Reference in a new issue