From b9bdb05459fa1f073e88eadfd5b7b39c0c0cd107 Mon Sep 17 00:00:00 2001 From: Peter Sprygada Date: Mon, 13 Nov 2017 14:24:13 -0500 Subject: [PATCH] fixes asa action plugin for connection=local (#32827) * fixes asa action plugin for connection=local This change fixes asa modules when using connection=local to load the provider values. * fix up pep8 issues --- lib/ansible/module_utils/asa.py | 12 +++-- lib/ansible/plugins/action/asa.py | 52 ++++++++----------- lib/ansible/plugins/connection/network_cli.py | 2 + lib/ansible/plugins/terminal/asa.py | 2 +- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/ansible/module_utils/asa.py b/lib/ansible/module_utils/asa.py index f9ffab282b2..b13b4836ac5 100644 --- a/lib/ansible/module_utils/asa.py +++ b/lib/ansible/module_utils/asa.py @@ -28,7 +28,8 @@ from ansible.module_utils._text import to_text from ansible.module_utils.basic import env_fallback, return_values from ansible.module_utils.network_common import to_list, EntityCollection -from ansible.module_utils.connection import Connection, exec_command +from ansible.module_utils.connection import exec_command +from ansible.module_utils.connection import Connection, ConnectionError _DEVICE_CONFIGS = {} _CONNECTION = None @@ -83,7 +84,7 @@ def get_connection(module): global _CONNECTION if _CONNECTION: return _CONNECTION - _CONNECTION = Connection(module) + _CONNECTION = Connection(module._socket_path) context = module.params['context'] @@ -148,8 +149,11 @@ def get_config(module, flags=None): def load_config(module, config): - conn = get_connection(module) - conn.edit_config(config) + try: + conn = get_connection(module) + conn.edit_config(config) + except ConnectionError as exc: + module.fail_json(msg=to_text(exc)) def get_defaults_flag(module): diff --git a/lib/ansible/plugins/action/asa.py b/lib/ansible/plugins/action/asa.py index b9b831e92d9..58c958cefff 100644 --- a/lib/ansible/plugins/action/asa.py +++ b/lib/ansible/plugins/action/asa.py @@ -41,39 +41,33 @@ class ActionModule(_ActionModule): def run(self, tmp=None, task_vars=None): - if self._play_context.connection != 'local': - return dict( - failed=True, - msg='invalid connection specified, expected connection=local, ' - 'got %s' % self._play_context.connection - ) + if self._play_context.connection == 'local': + provider = load_provider(asa_provider_spec, self._task.args) + pc = copy.deepcopy(self._play_context) + pc.connection = 'network_cli' + pc.network_os = 'asa' + pc.remote_addr = provider['host'] or self._play_context.remote_addr + pc.port = int(provider['port'] or self._play_context.port or 22) + pc.remote_user = provider['username'] or self._play_context.connection_user + pc.password = provider['password'] or self._play_context.password + pc.private_key_file = provider['ssh_keyfile'] or self._play_context.private_key_file + pc.timeout = int(provider['timeout'] or C.PERSISTENT_COMMAND_TIMEOUT) + pc.become = provider['authorize'] or False + pc.become_pass = provider['auth_pass'] + pc.become_method = 'enable' - provider = load_provider(asa_provider_spec, self._task.args) + display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) + connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) - pc = copy.deepcopy(self._play_context) - pc.connection = 'network_cli' - pc.network_os = 'asa' - pc.remote_addr = provider['host'] or self._play_context.remote_addr - pc.port = int(provider['port'] or self._play_context.port or 22) - pc.remote_user = provider['username'] or self._play_context.connection_user - pc.password = provider['password'] or self._play_context.password - pc.private_key_file = provider['ssh_keyfile'] or self._play_context.private_key_file - pc.timeout = int(provider['timeout'] or C.PERSISTENT_COMMAND_TIMEOUT) - pc.become = provider['authorize'] or False - pc.become_pass = provider['auth_pass'] + socket_path = connection.run() - display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) - connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) + display.vvvv('socket_path: %s' % socket_path, pc.remote_addr) + if not socket_path: + return {'failed': True, + 'msg': 'unable to open shell. Please see: ' + + 'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'} - socket_path = connection.run() - - display.vvvv('socket_path: %s' % socket_path, pc.remote_addr) - if not socket_path: - return {'failed': True, - 'msg': 'unable to open shell. Please see: ' + - 'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'} - - task_vars['ansible_socket'] = socket_path + task_vars['ansible_socket'] = socket_path result = super(ActionModule, self).run(tmp, task_vars) diff --git a/lib/ansible/plugins/connection/network_cli.py b/lib/ansible/plugins/connection/network_cli.py index 2bc44ef9bc6..0a20a42dd69 100644 --- a/lib/ansible/plugins/connection/network_cli.py +++ b/lib/ansible/plugins/connection/network_cli.py @@ -302,6 +302,8 @@ class Connection(ConnectionBase): A carriage return is automatically appended to this string. :returns: True if a prompt was found in ``resp``. False otherwise ''' + if not isinstance(prompts, list): + prompts = [prompts] prompts = [re.compile(r, re.I) for r in prompts] for regex in prompts: match = regex.search(resp) diff --git a/lib/ansible/plugins/terminal/asa.py b/lib/ansible/plugins/terminal/asa.py index d8fb4126a99..66f4e391a87 100644 --- a/lib/ansible/plugins/terminal/asa.py +++ b/lib/ansible/plugins/terminal/asa.py @@ -58,7 +58,7 @@ class TerminalModule(TerminalBase): if passwd: # Note: python-3.5 cannot combine u"" and r"" together. Thus make # an r string and use to_text to ensure it's text on both py2 and py3. - cmd[u'prompt'] = to_text(r"[\r\n]?password: $", errors='surrogate_or_strict') + cmd[u'prompts'] = to_text(r"[\r\n]?password: $", errors='surrogate_or_strict') cmd[u'answer'] = passwd try: