diff --git a/lib/ansible/module_utils/iosxr.py b/lib/ansible/module_utils/iosxr.py index e2c7c983916..be313cf1081 100644 --- a/lib/ansible/module_utils/iosxr.py +++ b/lib/ansible/module_utils/iosxr.py @@ -27,6 +27,21 @@ NET_COMMON_ARGS = dict( provider=dict() ) +CLI_PROMPTS_RE = [ + re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), + re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") +] + +CLI_ERRORS_RE = [ + re.compile(r"% ?Error"), + re.compile(r"% ?Bad secret"), + re.compile(r"invalid input", re.I), + re.compile(r"(?:incomplete|ambiguous) command", re.I), + re.compile(r"connection timed out", re.I), + re.compile(r"[^\r\n]+ not found", re.I), + re.compile(r"'[^']' +returned error code: ?\d+"), +] + def to_list(val): if isinstance(val, (list, tuple)): return list(val) @@ -48,9 +63,9 @@ class Cli(object): username = self.module.params['username'] password = self.module.params['password'] - self.shell = Shell() - try: + self.shell = Shell(kickstart=False, prompts_re=CLI_PROMPTS_RE, + errors_re=CLI_ERRORS_RE) self.shell.open(host, port=port, username=username, password=password) except Exception, exc: msg = 'failed to connecto to %s:%s - %s' % (host, port, str(exc)) @@ -98,7 +113,10 @@ class NetworkModule(AnsibleModule): return responses def execute(self, commands, **kwargs): - return self.connection.send(commands) + try: + return self.connection.send(commands) + except ShellError, exc: + self.fail_json(msg=exc.message, command=exc.command) def disconnect(self): self.connection.close()