### Summary

The `apt_repository` will fail with a somewhat confusing error if gnugp, and dirmngr manager are not installed.  Neither of these packages are Required/Essential/Important, and may not be already installed in minimal systems that you might want to run `apt_repository` on.

The fix might be to just include `gnupg` in the requirements section of the docs.

### Issue Type

Documentation Report

### Component Name

apt_repository

### Ansible Version

```console
$  ansible --version
ansible [core 2.11.4]
  config file = ...
  configured module search path = ...
  ansible python module location = ...
  ansible collection location = ...
  executable location = /usr/local/bin/ansible
  python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
  jinja version = 3.0.1
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed
```


### OS / Environment

Mostly a docs issue so this is N/A. But apt_repository applies to Debian, Ubuntu, and forks.

### Additional Information

Tells people that need gnupg when using apt_repository.

### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
'''Simple iterator to go over all sources. Empty, non-source, and other not valid lines will be skipped.'''
        for file, sources in self.files.items():
            for n, valid, enabled, source, comment in sources:
                if valid:
                    yield file, n, enabled, source, comment
    def _expand_path(self, filename):
        if '/' in filename:
            return filename
        else:
            return os.path.abspath(os.path.join(self._apt_cfg_dir('Dir::Etc::sourceparts'), filename))
    def _suggest_filename(self, line):
        def _cleanup_filename(s):
            filename = self.module.params['filename']
            if filename is not None:
                return filename
            return '_'.join(re.sub('[^a-zA-Z0-9]', ' ', s).split())
        def _strip_username_password(s):
            if '@' in s:
                s = s.split('@', 1)
                s = s[-1]
            return s
        
        line = re.sub(r'\[[^\]]+\]', '', line)
        line = re.sub(r'\w+://', '', line)
        
        parts = [part for part in line.split() if part not in VALID_SOURCE_TYPES]
        
        parts[0] = _strip_username_password(parts[0])
        return '%s.list' % _cleanup_filename(' '.join(parts[:1]))
    def _parse(self, line, raise_if_invalid_or_disabled=False):