diff --git a/bin/ansible-connection b/bin/ansible-connection index 43b3675a217..09656a55415 100755 --- a/bin/ansible-connection +++ b/bin/ansible-connection @@ -105,10 +105,6 @@ class ConnectionProcess(object): self.connection.set_options(var_options=variables) self.connection._connect() - # implementation plugins are updated while connection initialization - if hasattr(self.connection, 'set_implementation_plugin_options'): - self.connection.set_implementation_plugin_options(var_options=variables) - self.connection._socket_path = self.socket_path self.srv.register(self.connection) messages.extend(sys.stdout.getvalue().splitlines()) diff --git a/lib/ansible/plugins/connection/__init__.py b/lib/ansible/plugins/connection/__init__.py index d7e86e2510c..da4a9b4dedf 100644 --- a/lib/ansible/plugins/connection/__init__.py +++ b/lib/ansible/plugins/connection/__init__.py @@ -301,6 +301,7 @@ class NetworkConnectionBase(ConnectionBase): self._local.set_options() self._implementation_plugins = [] + self._cached_variables = (None, None, None) # reconstruct the socket_path and set instance values accordingly self._ansible_playbook_pid = kwargs.get('ansible_playbook_pid') @@ -317,6 +318,11 @@ class NetworkConnectionBase(ConnectionBase): return method raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) + def _connect(self): + for plugin in self._implementation_plugins: + plugin.set_options(*self._cached_variables) + self._cached_variables = (None, None, None) + def exec_command(self, cmd, in_data=None, sudoable=True): return self._local.exec_command(cmd, in_data, sudoable) @@ -344,14 +350,7 @@ class NetworkConnectionBase(ConnectionBase): def set_options(self, task_keys=None, var_options=None, direct=None): super(NetworkConnectionBase, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct) - self.set_implementation_plugin_options(task_keys=task_keys, var_options=var_options, direct=direct) - - def set_implementation_plugin_options(self, task_keys=None, var_options=None, direct=None): - ''' - initialize implementation plugin options - ''' - for plugin in self._implementation_plugins: - plugin.set_options(task_keys=task_keys, var_options=var_options, direct=direct) + self._cached_variables = (task_keys, var_options, direct) def _update_connection_state(self): ''' diff --git a/lib/ansible/plugins/connection/httpapi.py b/lib/ansible/plugins/connection/httpapi.py index e651f06bb6e..a8718c5e877 100644 --- a/lib/ansible/plugins/connection/httpapi.py +++ b/lib/ansible/plugins/connection/httpapi.py @@ -206,10 +206,8 @@ class Connection(NetworkConnectionBase): httpapi = httpapi_loader.get(self._network_os, self) if httpapi: - display.vvvv('loaded API plugin for network_os %s' % self._network_os, host=self._play_context.remote_addr) + display.vvvv('loaded API plugin for network_os %s' % self._network_os, host=host) self._implementation_plugins.append(httpapi) - httpapi.set_become(self._play_context) - httpapi.login(self.get_option('remote_user'), self.get_option('password')) else: raise AnsibleConnectionFailure('unable to load API plugin for network_os %s' % self._network_os) @@ -220,6 +218,11 @@ class Connection(NetworkConnectionBase): else: display.vvvv('unable to load cliconf for network_os %s' % self._network_os) + super(Connection, self)._connect() + + httpapi.set_become(self._play_context) + httpapi.login(self.get_option('remote_user'), self.get_option('password')) + self._connected = True def close(self): diff --git a/lib/ansible/plugins/connection/netconf.py b/lib/ansible/plugins/connection/netconf.py index 697f7ed3e97..93468f14384 100644 --- a/lib/ansible/plugins/connection/netconf.py +++ b/lib/ansible/plugins/connection/netconf.py @@ -307,6 +307,8 @@ class Connection(NetworkConnectionBase): display.display('unable to load netconf plugin for network_os %s, falling back to default plugin' % self._network_os) self._implementation_plugins.append(netconf) + super(Connection, self)._connect() + return 0, to_bytes(self._manager.session_id, errors='surrogate_or_strict'), b'' def close(self): diff --git a/lib/ansible/plugins/connection/network_cli.py b/lib/ansible/plugins/connection/network_cli.py index 7dfdcbb78cd..e649c32c61b 100644 --- a/lib/ansible/plugins/connection/network_cli.py +++ b/lib/ansible/plugins/connection/network_cli.py @@ -300,6 +300,8 @@ class Connection(NetworkConnectionBase): else: display.vvvv('unable to load cliconf for network_os %s' % self._network_os) + super(Connection, self)._connect() + self.receive(prompts=self._terminal.terminal_initial_prompt, answer=self._terminal.terminal_initial_answer, newline=self._terminal.terminal_inital_prompt_newline)