### Summary

If you fail to add `become: true` on an Ubuntu system with systemd, you will quietly receive a list of the `sysv` services without any systemd services. This is due to the service facts module implementing its own separate test for systemd https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/service_facts.py#L224-L234 which quietly ignores a failure.

If it were to use the value of the ansible fact `ansible_service_mgr` instead then it would correctly catch this failure and report the warning.

### Issue Type

Bug Report

### Component Name

service_facts module

### Ansible Version

```console
$ ansible --version
ansible [core 2.12.1]
  config file = None
  configured module search path = ['/Users/jrhett/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/homebrew/Cellar/ansible/5.2.0/libexec/lib/python3.10/site-packages/ansible
  ansible collection location = /Users/jrhett/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/homebrew/bin/ansible
  python version = 3.10.1 (main, Dec  6 2021, 22:18:13) [Clang 13.0.0 (clang-1300.0.29.3)]
  jinja version = 3.0.3
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed
(empty)
```


### OS / Environment

Target node is Ubuntu 20.04

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```shell
$ ansible -m service_facts <node ip>
```


### Expected Results

`WARNING: Could not find status for all services. Sometimes this is due to insufficient privileges.`

### Actual Results

```console
A quiet success with only sysv services.


52.14.195.85 | SUCCESS => {
    "ansible_facts": {
        "services": {
            "acpid": {
                "name": "acpid",
                "source": "sysv",
                "state": "stopped"
            },
            "apparmor": {
                "name": "apparmor",
                "source": "sysv",
                "state": "stopped"
            },
```
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
if bad in fields:  
                    status_val = bad
                    fields = fields[1:]
                    break
            else:
                
                status_val = fields[2]
            
            service_name = fields[0]
            if fields[3] == "running":
                state_val = "running"
            services[service_name] = {"name": service_name, "state": state_val, "status": status_val, "source": "systemd"}
        
        rc, stdout, stderr = self.module.run_command("%s list-unit-files --no-pager --type service --all" % systemctl_path, use_unsafe_shell=True)
        for line in [svc_line for svc_line in stdout.split('\n') if '.service' in svc_line]:
            
            try:
                service_name, status_val = line.split()[:2]
            except IndexError:
                self.module.fail_json(msg="Malformed output discovered from systemd list-unit-files: {0}".format(line))
            if service_name not in services:
                rc, stdout, stderr = self.module.run_command("%s show %s --property=ActiveState" % (systemctl_path, service_name), use_unsafe_shell=True)
                state = 'unknown'
                if not rc and stdout != '':
                    state = stdout.replace('ActiveState=', '').rstrip()
                services[service_name] = {"name": service_name, "state": state, "status": status_val, "source": "systemd"}
            elif services[service_name]["status"] not in BAD_STATES:
                services[service_name]["status"] = status_val
        return services
class AIXScanService(BaseService):