### Summary

When the auto discovery method is used, python discovery happens first, and then the task command is executed.

However, if there is a connection problem, depending on the timing of when the connection gets restored, the python discovery could fail due to an AnsibleConnectionFailure, ignore it, and return /usr/bin/python. Then, the task command is executed with the wrong python interpreter.

It should be that if the python discovery fails (at least due to Connection failures - you could decide there are other cases where this should occur), that the command immediately fails. Or at least have an option to allow this behavior.

Here is the informal code change that we made to enable this behavior in /usr/local/lib/python3.8/site-packages/ansible/executor/interpreter_discovery.py:

```
@@ -14,6 +14,7 @@
 from ansible.module_utils.distro import LinuxDistribution
 from ansible.utils.display import Display
 from ansible.utils.plugin_docs import get_versioned_doclink
+from ansible.errors import AnsibleConnectionFailure
 from distutils.version import LooseVersion
 from traceback import format_exc

@@ -146,6 +147,8 @@
         return platform_interpreter
     except NotImplementedError as ex:
         display.vvv(msg=u'Python interpreter discovery fallback ({0})'.format(to_text(ex)), host=host)
+    except AnsibleConnectionFailure as ex:
+        raise ex
     except Exception as ex:
         if not is_silent:
             display.warning(msg=u'Unhandled error in Python interpreter discovery for host {0}: {1}'.format(host, to_text(ex)))
```

Simply allow the exception to fall-through to fail the task with a connection error, which will fail the task appropriately or allow the connection plugins to handle it appropriately.

### Issue Type

Bug Report

### Component Name

interpreter_python.py

### Ansible Version

```console
$ ansible --version
ansible [core 2.11.5]
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
  jinja version = 3.0.2
  libyaml = True
```


### Configuration

```console
# if using a version older than ansible-core 2.12 you should omit the '-t all'
$ ansible-config dump --only-changed -t all
```


### OS / Environment

RHEL8

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
ansible <host> -m ping -vvv
```
on a host that is down

### Expected Results

if the discovery fails due to a connection problem, the task fails

### Actual Results

```console
if the discovery fails due to a connection problem, it tries to execute the rest of the task anyway
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
res1 = u'PLATFORM\nLinux\nFOUND\n/usr/bin/python\n/usr/bin/python3\nENDFOUND'
    mock_action = MagicMock()
    mock_action._low_level_execute_command.side_effect = [{'stdout': res1}, {'stdout': mock_ubuntu_platform_res}]
    actual = discover_interpreter(mock_action, 'python', 'auto', {'inventory_hostname': u'host-fóöbär'})
    assert actual == u'/usr/bin/python3'
    assert len(mock_action.method_calls) == 2
def test_discovery_interpreter_non_linux():
    mock_action = MagicMock()
    mock_action._low_level_execute_command.return_value = \
        {'stdout': u'PLATFORM\nDarwin\nFOUND\n/usr/bin/python\nENDFOUND'}
    actual = discover_interpreter(mock_action, 'python', 'auto_legacy', {'inventory_hostname': u'host-fóöbär'})
    assert actual == u'/usr/bin/python'
    assert len(mock_action.method_calls) == 2
    assert mock_action.method_calls[1][0] == '_discovery_warnings.append'
    assert u'Platform darwin on host host-fóöbär is using the discovered Python interpreter at /usr/bin/python, ' \
           u'but future installation of another Python interpreter could change the meaning of that path' \
           in mock_action.method_calls[1][1][0]
def test_no_interpreters_found():
    mock_action = MagicMock()
    mock_action._low_level_execute_command.return_value = {'stdout': u'PLATFORM\nWindows\nFOUND\nENDFOUND'}
    actual = discover_interpreter(mock_action, 'python', 'auto_legacy', {'inventory_hostname': u'host-fóöbär'})
    assert actual == u'/usr/bin/python'
    assert len(mock_action.method_calls) == 2
    assert mock_action.method_calls[1][0] == '_discovery_warnings.append'
    assert u'No python interpreters found for host host-fóöbär (tried' \
           in mock_action.method_calls[1][1][0]