##### SUMMARY
Ansible crashes when `gather_facts` is true for a playbook targeting virtual Nexus switches. I believe this is because it’s looking for information about fans but it’s virtual so there are no fans.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
nxos_facts

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.9.1
  config file = /Users/kbreit/development/gitlab/dev/network_configuration/ansible.cfg
  configured module search path = ['/Users/kbreit/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.7.5 (default, Nov  1 2019, 02:16:38) [Clang 10.0.0 (clang-1000.11.45.5)]
```

##### OS / ENVIRONMENT
Control node is macOS
Target is NX-OS 9.3(3)

##### STEPS TO REPRODUCE
<!--- Paste example playbooks or commands between quotes below -->
```yaml

- name: Configure Access Devices
  connection: network_cli
  gather_facts: true
  hosts: all
  tasks:
  - debug: 
       var: hostvars
```

##### EXPECTED RESULTS
I expect the playbook to execute, even if it’s a single task. It should collect facts.

##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->

<!--- Paste verbatim command output between quotes -->
```paste below

<e7csco0nxos03.datalinklabs.local> EXEC /bin/sh -c 'rm -f -r /Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/ > /dev/null 2>&1 && sleep 0'
fatal: [e7csco0nxos03.datalinklabs.local]: FAILED! => {
    "ansible_facts": {},
    "changed": false,
    "failed_modules": {
        "nxos_facts": {
            "ansible_facts": {
                "discovered_interpreter_python": "/usr/bin/python"
            },
            "exception": "Traceback (most recent call last):\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 102, in <module>\n    _ansiballz_main()\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 94, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 40, in invoke_module\n    runpy.run_module(mod_name='ansible.modules.network.nxos.nxos_facts', init_globals=None, run_name='__main__', alter_sys=True)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 188, in run_module\n    fname, loader, pkg_name)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 82, in _run_module_code\n    mod_name, mod_fname, mod_loader, pkg_name)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 72, in _run_code\n    exec code in run_globals\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/modules/network/nxos/nxos_facts.py\", line 239, in <module>\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/modules/network/nxos/nxos_facts.py\", line 230, in main\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/facts.py\", line 71, in get_facts\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/common/facts/facts.py\", line 124, in get_network_legacy_facts\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/legacy/base.py\", line 594, in populate\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/legacy/base.py\", line 631, in parse_structured_fan_info\nKeyError: 'TABLE_faninfo'\n",
            "failed": true,
            "module_stderr": "Traceback (most recent call last):\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 102, in <module>\n    _ansiballz_main()\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 94, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/Users/kbreit/.ansible/tmp/ansible-local-78117vavbd2gv/ansible-tmp-1579321879.577556-95130404538599/AnsiballZ_nxos_facts.py\", line 40, in invoke_module\n    runpy.run_module(mod_name='ansible.modules.network.nxos.nxos_facts', init_globals=None, run_name='__main__', alter_sys=True)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 188, in run_module\n    fname, loader, pkg_name)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 82, in _run_module_code\n    mod_name, mod_fname, mod_loader, pkg_name)\n  File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py\", line 72, in _run_code\n    exec code in run_globals\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/modules/network/nxos/nxos_facts.py\", line 239, in <module>\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/modules/network/nxos/nxos_facts.py\", line 230, in main\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/facts.py\", line 71, in get_facts\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/common/facts/facts.py\", line 124, in get_network_legacy_facts\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/legacy/base.py\", line 594, in populate\n  File \"/var/folders/mv/cqcg7q510t9b5bn580y3ksb80000gq/T/ansible_nxos_facts_payload_YMZD8m/ansible_nxos_facts_payload.zip/ansible/module_utils/network/nxos/facts/legacy/base.py\", line 631, in parse_structured_fan_info\nKeyError: 'TABLE_faninfo'\n",
            "module_stdout": "",
            "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
            "rc": 1,
            "warnings": [
                "Platform darwin on host e7csco0nxos03.datalinklabs.local is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information."
            ]
        }
    },
    "msg": "The following modules failed to execute: nxos_facts\n"
}

```

if data.get('powersup').get('TABLE_psinfo_n3k'):
            fact = data['powersup']['TABLE_psinfo_n3k']['ROW_psinfo_n3k']
        else:
            if isinstance(data['powersup']['TABLE_psinfo'], list):
                fact = []
                for i in data['powersup']['TABLE_psinfo']:
                    fact.append(i['ROW_psinfo'])
            else:
                fact = data['powersup']['TABLE_psinfo']['ROW_psinfo']
        objects = list(self.transform_iterable(fact, self.POWERSUP_MAP))
        return objects
    def parse_hostname(self, data):
        match = re.search(r'\s+Device name:\s+(\S+)', data, re.M)
        if match:
            return match.group(1)
    def parse_os(self, data):
        match = re.search(r'\s+system:\s+version\s*(\S+)', data, re.M)
        if match:
            return match.group(1)
        else:
            match = re.search(r'\s+kickstart:\s+version\s*(\S+)', data, re.M)
            if match:
                return match.group(1)
    def parse_platform(self, data):