##### SUMMARY
Setting `cache_timeout: 0` in an inventory plugin configuration has no effect.  The default value is used instead.
##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
`lib/ansible/plugins/inventory/__init__.py`
##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.10.0b1.post0
  config file = /export/home/orion-admin/ansible-boulder/ansible.cfg
  configured module search path = [u'/export/home/orion-admin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /export/home/orion-admin/ansible/lib/ansible
  executable location = /export/home/orion-admin/ansible/bin/ansible
  python version = 2.7.5 (default, Apr  1 2020, 10:09:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```
also with ansible 2.9.10
##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/export/home/orion-admin/ansible-boulder/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/export/home/orion-admin/ansible-boulder/ansible.cfg) = -C -o ControlMaster=auto -o ControlPersist=60s -o ForwardX11=no -o ForwardAgent=no
DEFAULT_BECOME(/export/home/orion-admin/ansible-boulder/ansible.cfg) = True
DEFAULT_CALLBACK_WHITELIST(/export/home/orion-admin/ansible-boulder/ansible.cfg) = [u'profile_tasks']
DEFAULT_FORKS(/export/home/orion-admin/ansible-boulder/ansible.cfg) = 25
DEFAULT_GATHERING(/export/home/orion-admin/ansible-boulder/ansible.cfg) = smart
DEFAULT_HOST_LIST(/export/home/orion-admin/ansible-boulder/ansible.cfg) = [u'/export/home/orion-admin/ansible-boulder/inventory']
DEFAULT_INVENTORY_PLUGIN_PATH(/export/home/orion-admin/ansible-boulder/ansible.cfg) = [u'/export/home/orion-admin/ansible-boulder/plugins/inventory']
DEFAULT_JINJA2_EXTENSIONS(/export/home/orion-admin/ansible-boulder/ansible.cfg) = jinja2.ext.do
DEFAULT_ROLES_PATH(/export/home/orion-admin/ansible-boulder/ansible.cfg) = [u'/export/home/orion-admin/ansible-boulder/roles']
DEFAULT_TIMEOUT(/export/home/orion-admin/ansible-boulder/ansible.cfg) = 20
INJECT_FACTS_AS_VARS(/export/home/orion-admin/ansible-boulder/ansible.cfg) = True
INVENTORY_ENABLED(/export/home/orion-admin/ansible-boulder/ansible.cfg) = [u'cobbler', u'ini']
```

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->
EL 7.8.
python 2.7.5

##### STEPS TO REPRODUCE

Use a caching inventory plugin (I'm testing with cobbler - https://github.com/ansible-collections/community.general/pull/627) and set cache_timeout to 0.  Observe that it instead uses the default value.
##### EXPECTED RESULTS
cache plugin _timeout is set to 0


The issue is the following two code segments:
https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/inventory/__init__.py#L235
```
        if 'cache' in self._options and self.get_option('cache'):
            cache_option_keys = [('_uri', 'cache_connection'), ('_timeout', 'cache_timeout'), ('_prefix', 'cache_prefix')]
            cache_options = dict((opt[0], self.get_option(opt[1])) for opt in cache_option_keys if self.get_option(opt[1]))
            self._cache = get_cache_plugin(self.get_option('cache_plugin'), **cache_options)
```
and https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/inventory/__init__.py#L323 
```
        cache_option_keys = [('_uri', 'cache_connection'), ('_timeout', 'cache_timeout'), ('_prefix', 'cache_prefix')]
        cache_options = dict((opt[0], self.get_option(opt[1])) for opt in cache_option_keys if self.get_option(opt[1]))
```
if `self.get_option(opt[1])` evaluates to `false`, which a value of `0` for `cache_timeout` does, then the option value is not passed on to cache_options.
raise AnsibleParserError("Could not generate parent group %s for group %s: %s" % (raw_parent_name, key, to_native(e)))
                                continue
                        new_raw_group_names = []
                        if isinstance(key, string_types):
                            new_raw_group_names.append(key)
                        elif isinstance(key, list):
                            for name in key:
                                new_raw_group_names.append(name)
                        elif isinstance(key, Mapping):
                            for (gname, gval) in key.items():
                                name = '%s%s%s' % (gname, sep, gval)
                                new_raw_group_names.append(name)
                        else:
                            raise AnsibleParserError("Invalid group name format, expected a string or a list of them or dictionary, got: %s" % type(key))
                        for bare_name in new_raw_group_names:
                            gname = self._sanitize_group_name('%s%s%s' % (prefix, sep, bare_name))
                            result_gname = self.inventory.add_group(gname)
                            self.inventory.add_host(host, result_gname)
                            if raw_parent_name:
                                parent_name = self._sanitize_group_name(raw_parent_name)
                                self.inventory.add_group(parent_name)
                                self.inventory.add_child(parent_name, result_gname)
                    else:
                        
                        
                        if strict and key not in ([], {}):
                            raise AnsibleParserError("No key or key resulted empty for %s in host %s, invalid entry" % (keyed.get('key'), host))
                else:
                    raise AnsibleParserError("Invalid keyed group entry, it must be a dictionary: %s " % keyed)