def _load_config(module, config): """Sends configuration commands to the remote device """ connection = Connection(module._socket_path) rc, out, err = exec_command(module, 'mmi-mode enable') if rc != 0: module.fail_json(msg='unable to set mmi-mode enable', output=err) rc, out, err = exec_command(module, 'system-view immediately') if rc != 0: module.fail_json(msg='unable to enter system-view', output=err) current_view_prompt = system_view_prompt = connection.get_prompt() for index, cmd in enumerate(config): level = command_level(cmd) current_view_prompt = connection.get_prompt() rc, out, err = exec_command(module, cmd) if rc != 0: print_msg = cli_err_msg(cmd.strip(), err) # re-try command max 3 times for i in (1, 2, 3): current_view_prompt = connection.get_prompt() if current_view_prompt != system_view_prompt and not_user_view(current_view_prompt): exec_command(module, "quit") current_view_prompt = connection.get_prompt() # if current view is system-view, break. if current_view_prompt == system_view_prompt and level > 0: break elif current_view_prompt == system_view_prompt or not not_user_view(current_view_prompt): break rc, out, err = exec_command(module, cmd) if rc == 0: print_msg = None break if print_msg is not None: module.fail_json(msg=print_msg)
def run(self, tmp=None, task_vars=None): del tmp # tmp no longer has any effect module_name = self._task.action.split('.')[-1] self._config_module = True if module_name == 'bigip_imish_config' else False persistent_connection = self._play_context.connection.split('.')[-1] socket_path = None transport = 'rest' if persistent_connection == 'network_cli': provider = self._task.args.get('provider', {}) if any(provider.values()): display.warning( "'provider' is unnecessary when using 'network_cli' and will be ignored" ) elif self._play_context.connection == 'local': provider = load_provider(f5_provider_spec, self._task.args) transport = provider['transport'] or transport display.vvvv('connection transport is %s' % transport, self._play_context.remote_addr) if transport == 'cli': pc = copy.deepcopy(self._play_context) pc.connection = 'network_cli' pc.network_os = 'bigip' pc.remote_addr = provider.get('server', self._play_context.remote_addr) pc.port = int(provider['server_port'] or self._play_context.port or 22) pc.remote_user = provider.get( 'user', self._play_context.connection_user) pc.password = provider.get('password', self._play_context.password) pc.private_key_file = provider[ 'ssh_keyfile'] or self._play_context.private_key_file command_timeout = int(provider['timeout'] or C.PERSISTENT_COMMAND_TIMEOUT) display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) connection = self._shared_loader_obj.connection_loader.get( 'persistent', pc, sys.stdin, task_uuid=self._task._uuid) connection.set_options( direct={'persistent_command_timeout': command_timeout}) 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 if (self._play_context.connection == 'local' and transport == 'cli') or persistent_connection == 'network_cli': # make sure we are in the right cli context which should be # enable mode and not config module if socket_path is None: socket_path = self._connection.socket_path conn = Connection(socket_path) out = conn.get_prompt() while '(config' in to_text( out, errors='surrogate_then_replace').strip(): display.vvvv('wrong context, sending exit to device', self._play_context.remote_addr) conn.send_command('exit') out = conn.get_prompt() result = super(ActionModule, self).run(task_vars=task_vars) return result