### Summary

Detection of device serial number relies on `sg_inq` command, particularly on searching for `Unit serial number:` string in the output. However the output is different on RHEL 8, so serial number isn't detected, below is an example:
```
# sg_inq /dev/nvme0n1
Identify controller for /dev/nvme0n1:
  Model number: Amazon Elastic Block Store
  Serial number: vol00030c2ca006fa585
  Firmware revision: 1.0
  Version: 0.0
  No optional admin command support
  No optional NVM command support
  PCI vendor ID VID/SSVID: 0x1d0f/0x1d0f
  IEEE OUI Identifier: 0xa002dc
  Controller ID: 0x0
  Number of namespaces: 1
  Maximum data transfer size: 64 pages
  Namespace 1 (deduced from device name):
    Namespace size/capacity: 62914560/62914560 blocks
    Namespace utilization: 0 blocks
    Number of LBA formats: 1
    Index LBA size: 0
    LBA format 0 support: <-- active
      Logical block size: 512 bytes
      Approximate namespace size: 32 GB
      Metadata size: 0 bytes
      Relative performance: Best [0x0]
```
I'd propose to use the `lsblk` command to get serial number more reliable, for example:
```
# lsblk /dev/nvme0n1 -d -l -o SERIAL -n
vol00030c2ca006fa585
```
Below is proposed patch:
```diff
--- site-packages/ansible/module_utils/facts/hardware/linux.py.orig  2021-04-13 01:03:23.000000000 +0200
+++ site-packages/ansible/module_utils/facts/hardware/linux.py       2021-08-06 11:50:47.683629740 +0200
@@ -698,15 +698,14 @@
             for key in ['vendor', 'model', 'sas_address', 'sas_device_handle']:
                 d[key] = get_file_content(sysdir + "/device/" + key)

-            sg_inq = self.module.get_bin_path('sg_inq')
+            lsblk_path = self.module.get_bin_path('lsblk')

-            if sg_inq:
-                device = "/dev/%s" % (block)
-                rc, drivedata, err = self.module.run_command([sg_inq, device])
+            if lsblk_path:
+                rc, drivedata, err = self.module.run_command("%s /dev/%s -d -l -o SERIAL -n" % (lsblk_path, block))
                 if rc == 0:
-                    serial = re.search(r"Unit serial number:\s+(\w+)", drivedata)
+                    serial = drivedata.rstrip()
                     if serial:
-                        d['serial'] = serial.group(1)
+                        d['serial'] = serial

             for key, test in [('removable', '/removable'),
                               ('support_discard', '/queue/discard_granularity'),
```

### Issue Type

Bug Report

### Component Name

module_utils/facts/hardware/linux.py

### Ansible Version

```console
$ ansible --version
ansible 2.10.8
  config file = /home/velisseev/aws/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/blue-python/3.6/lib/python3.6/site-packages/ansible
  executable location = /opt/blue-python/3.6/bin/ansible
  python version = 3.6.13 (default, Feb 22 2021, 12:57:38) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
```


### Configuration

```console
$ ansible-config dump --only-changed
ANSIBLE_FORCE_COLOR(/home/xxx/aws/ansible/ansible.cfg) = True
ANSIBLE_PIPELINING(/home/xxx/aws/ansible/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/home/xxx/aws/ansible/ansible.cfg) = -C -o ControlMaster=auto -o ControlPersist=1800s
ANSIBLE_SSH_RETRIES(/home/xxx/aws/ansible/ansible.cfg) = 3
COLOR_DIFF_REMOVE(/home/xxx/aws/ansible/ansible.cfg) = yellow
DEFAULT_FORKS(/home/xxx/aws/ansible/ansible.cfg) = 50
DEFAULT_HOST_LIST(/home/xxx/aws/ansible/ansible.cfg) = ['/home/xxx/aws/ansible/inventory']
DEFAULT_LOG_PATH(env: ANSIBLE_LOG_PATH) = /home/xxx/ansible.log
DEFAULT_MANAGED_STR(/home/xxx/aws/ansible/ansible.cfg) = Ansible managed
DEFAULT_REMOTE_USER(/home/xxx/aws/ansible/ansible.cfg) = centos
DEFAULT_STDOUT_CALLBACK(/home/xxx/aws/ansible/ansible.cfg) = yaml
DISPLAY_SKIPPED_HOSTS(env: ANSIBLE_DISPLAY_SKIPPED_HOSTS) = True
HOST_KEY_CHECKING(/home/xxx/aws/ansible/ansible.cfg) = False
INJECT_FACTS_AS_VARS(/home/xxx/aws/ansible/ansible.cfg) = True
SHOW_CUSTOM_STATS(/home/xxx/aws/ansible/ansible.cfg) = True
```


### OS / Environment

RHEL 8

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
- name: Collect facts for devices
  setup:
    gather_subset:
      - '!all'
      - '!any'
      - devices
- debug:
    var: ansible_facts.devices
```


### Expected Results

Serial numbers should be included while then don't.

### Actual Results

```console
Serial numbers are not included in `ansible_facts.devices` dict.
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
'inode_available': 26860880,
                         'inode_total': 26902528,
                         'inode_used': 41648,
                         'mount': '/home',
                         'options': 'rw,seclabel,relatime,data=ordered',
                         'size_available': 410246647808,
                         'size_total': 433647640576,
                         'uuid': 'N/A'}
        home_info = [x for x in mount_facts['mounts'] if x['mount'] == '/home'][0]
        self.maxDiff = 4096
        self.assertDictEqual(home_info, home_expected)
    @patch('ansible.module_utils.facts.hardware.linux.get_file_content', return_value=MTAB)
    def test_get_mtab_entries(self, mock_get_file_content):
        module = Mock()
        lh = linux.LinuxHardware(module=module, load_on_init=False)
        mtab_entries = lh._mtab_entries()
        self.assertIsInstance(mtab_entries, list)
        self.assertIsInstance(mtab_entries[0], list)
        self.assertEqual(len(mtab_entries), 38)
    @patch('ansible.module_utils.facts.hardware.linux.LinuxHardware._run_findmnt', return_value=(0, FINDMNT_OUTPUT, ''))
    def test_find_bind_mounts(self, mock_run_findmnt):
        module = Mock()
        lh = linux.LinuxHardware(module=module, load_on_init=False)
        bind_mounts = lh._find_bind_mounts()
        
        self.assertIsInstance(bind_mounts, set)
        self.assertEqual(len(bind_mounts), 1)
        self.assertIn('/not/a/real/bind_mount', bind_mounts)
    @patch('ansible.module_utils.facts.hardware.linux.LinuxHardware._run_findmnt', return_value=(37, '', ''))
    def test_find_bind_mounts_non_zero(self, mock_run_findmnt):