##### SUMMARY
<!--- Explain the problem briefly below, add suggestions to wording or structure -->
The [main configuration documentation](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-pipelining) says that pipelining is enabled in the `ssh_connection` or `connection` section.

The [ssh connection plugin](https://docs.ansible.com/ansible/latest/plugins/connection/ssh.html#parameter-pipelining) configuration says pipelining should  be enabled in the `defaults` section.

#31125 (and the associated commit) seems to imply that the `ssh_connection` section is legacy, but the comments (https://github.com/ansible/ansible/issues/31125#issuecomment-334071699) seem to say otherwise.

The actual sections (as demonstrated in the configuration section below) that works are `ssh_connection` and `connection`.


##### ISSUE TYPE
- Documentation Report

##### COMPONENT NAME
ssh

##### ANSIBLE VERSION

```paste below
ansible 2.9.9
  config file = /c/xxx/ansible/ansible.cfg
  configured module search path = ['/c/Users/bendem/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /c/Users/bendem/.local/share/virtualenvs/ansible-oaopcvR0/lib/python3.8/site-packages/ansible
  executable location = /c/Users/bendem/.local/share/virtualenvs/ansible-oaopcvR0/bin/ansible
  python version = 3.8.3 (default, May 18 2020, 08:39:23) [GCC 9.3.0]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
With `[defaults]\npipelining = true`

```
ALLOW_WORLD_READABLE_TMPFILES(/c/xxx/ansible/ansible.cfg) = False
ANSIBLE_SSH_EXECUTABLE(/c/xxx/ansible/ansible.cfg) = /usr/bin/ssh
ANSIBLE_SSH_RETRIES(/c/xxx/ansible/ansible.cfg) = 1
DEFAULT_HOST_LIST(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/inventory/inventory.ini']
DEFAULT_ROLES_PATH(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/vendors/roles', '/c/xxx/ansible/roles']
DEFAULT_VAULT_ID_MATCH(/c/xxx/ansible/ansible.cfg) = true
DIFF_ALWAYS(/c/xxx/ansible/ansible.cfg) = True
INTERPRETER_PYTHON(/c/xxx/ansible/ansible.cfg) = /usr/bin/python3
INVENTORY_UNPARSED_IS_FAILED(/c/xxx/ansible/ansible.cfg) = True
```

With `[ssh_connection]\npipelining = true`

```paste below
ALLOW_WORLD_READABLE_TMPFILES(/c/xxx/ansible/ansible.cfg) = False
ANSIBLE_PIPELINING(/c/xxx/ansible/ansible.cfg) = True
ANSIBLE_SSH_EXECUTABLE(/c/xxx/ansible/ansible.cfg) = /usr/bin/ssh
ANSIBLE_SSH_RETRIES(/c/xxx/ansible/ansible.cfg) = 1
DEFAULT_HOST_LIST(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/inventory/inventory.ini']
DEFAULT_ROLES_PATH(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/vendors/roles', '/c/xxx/ansible/roles']
DEFAULT_VAULT_ID_MATCH(/c/xxx/ansible/ansible.cfg) = true
DIFF_ALWAYS(/c/xxx/ansible/ansible.cfg) = True
INTERPRETER_PYTHON(/c/xxx/ansible/ansible.cfg) = /usr/bin/python3
INVENTORY_UNPARSED_IS_FAILED(/c/xxx/ansible/ansible.cfg) = True
```

With `[connection]\npipelining = true`

```paste below
ALLOW_WORLD_READABLE_TMPFILES(/c/xxx/ansible/ansible.cfg) = False
ANSIBLE_PIPELINING(/c/xxx/ansible/ansible.cfg) = True
ANSIBLE_SSH_EXECUTABLE(/c/xxx/ansible/ansible.cfg) = /usr/bin/ssh
ANSIBLE_SSH_RETRIES(/c/xxx/ansible/ansible.cfg) = 1
DEFAULT_HOST_LIST(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/inventory/inventory.ini']
DEFAULT_ROLES_PATH(/c/xxx/ansible/ansible.cfg) = ['/c/xxx/ansible/vendors/roles', '/c/xxx/ansible/roles']
DEFAULT_VAULT_ID_MATCH(/c/xxx/ansible/ansible.cfg) = true
DIFF_ALWAYS(/c/xxx/ansible/ansible.cfg) = True
INTERPRETER_PYTHON(/c/xxx/ansible/ansible.cfg) = /usr/bin/python3
INVENTORY_UNPARSED_IS_FAILED(/c/xxx/ansible/ansible.cfg) = True
```

##### OS / ENVIRONMENT
Windows 10, msys2 python3, not that it matters.

##### ADDITIONAL INFORMATION
<!--- Describe how this improves the documentation, e.g. before/after situation or screenshots -->

<!--- HINT: You can paste gist.github.com links for larger files -->

"""Method to perform a clean up at the end of an action plugin execution
        By default this is designed to clean up the shell tmpdir, and is toggled based on whether
        async is in use
        Action plugins may override this if they deem necessary, but should still call this method
        via super
        """
        if force or not self._task.async_val:
            self._remove_tmp_path(self._connection._shell.tmpdir)
    def get_plugin_option(self, plugin, option, default=None):
        """Helper to get an option from a plugin without having to use
        the try/except dance everywhere to set a default
        """
        try:
            return plugin.get_option(option)
        except (AttributeError, KeyError):
            return default
    def get_become_option(self, option, default=None):
        return self.get_plugin_option(self._connection.become, option, default=default)
    def get_connection_option(self, option, default=None):
        return self.get_plugin_option(self._connection, option, default=default)
    def get_shell_option(self, option, default=None):
        return self.get_plugin_option(self._connection._shell, option, default=default)
    def _remote_file_exists(self, path):
        cmd = self._connection._shell.exists(path)
        result = self._low_level_execute_command(cmd=cmd, sudoable=True)
        if result['rc'] == 0:
            return True
        return False
    def _configure_module(self, module_name, module_args, task_vars=None):