diff --git a/lib/ansible/module_utils/ios.py b/lib/ansible/module_utils/ios.py index b1c146583e..45754701aa 100644 --- a/lib/ansible/module_utils/ios.py +++ b/lib/ansible/module_utils/ios.py @@ -65,18 +65,19 @@ def get_config(module, flags=[]): _DEVICE_CONFIGS[cmd] = cfg return cfg -def to_commands(commands): - transform = ComplexList(dict( - command=dict(key=True), - prompt=dict(), - response=dict() - )) +def to_commands(module, commands): + spec = { + 'command': dict(key=True), + 'prompt': dict(), + 'response': dict() + } + transform = ComplexList(spec, module) return transform(commands) def run_commands(module, commands, check_rc=True): responses = list() - commands = to_commands(to_list(commands)) + commands = to_commands(module, to_list(commands)) for cmd in commands: cmd = module.jsonify(cmd) rc, out, err = exec_command(module, cmd) diff --git a/lib/ansible/plugins/action/ios.py b/lib/ansible/plugins/action/ios.py index bae042c1e3..13daf0fada 100644 --- a/lib/ansible/plugins/action/ios.py +++ b/lib/ansible/plugins/action/ios.py @@ -53,10 +53,11 @@ class ActionModule(_ActionModule): pc.become = provider['authorize'] or False pc.become_pass = provider['auth_pass'] + connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) + socket_path = self._get_socket_path(pc) if not os.path.exists(socket_path): # start the connection if it isn't started - connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) connection.exec_command('EXEC: show version') task_vars['ansible_socket'] = socket_path @@ -66,7 +67,14 @@ class ActionModule(_ActionModule): self._play_context.become_method = None - return super(ActionModule, self).run(tmp, task_vars) + results = super(ActionModule, self).run(tmp, task_vars) + + # need to make sure to leave config mode if the module didn't clean up + rc, out, err = connection.exec_command('EXEC: prompt()') + if str(out).strip().endswith(')#'): + connection.exec_command('EXEC: exit') + + return results def _get_socket_path(self, play_context): ssh = connection_loader.get('ssh', class_only=True)