mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
fix 'return false' from parse
this was abandoned early on the manger side but seems like we left behind on plugin side. more flexible extensions with yaml plugin validate data correctly for yaml/constructed fixed issue with only adding one child to keyed, the group only got the host that forced it's creation fixes #31382 fixes #31365
This commit is contained in:
parent
f2ade09dce
commit
e4c61ea9a1
5 changed files with 28 additions and 19 deletions
|
@ -142,10 +142,13 @@ class BaseInventoryPlugin(object):
|
||||||
continue
|
continue
|
||||||
if isinstance(groups, string_types):
|
if isinstance(groups, string_types):
|
||||||
groups = [groups]
|
groups = [groups]
|
||||||
|
if isinstance(groups, list):
|
||||||
for group_name in groups:
|
for group_name in groups:
|
||||||
if group_name not in self.inventory.groups:
|
if group_name not in self.inventory.groups:
|
||||||
self.inventory.add_group(group_name)
|
self.inventory.add_group(group_name)
|
||||||
self.inventory.add_child(group_name, host)
|
self.inventory.add_child(group_name, host)
|
||||||
|
else:
|
||||||
|
raise AnsibleOptionsError("Invalid group name format, expected string or list of strings, got: %s" % type(groups))
|
||||||
else:
|
else:
|
||||||
raise AnsibleOptionsError("No key supplied, invalid entry")
|
raise AnsibleOptionsError("No key supplied, invalid entry")
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -10,7 +10,7 @@ DOCUMENTATION = '''
|
||||||
version_added: "2.4"
|
version_added: "2.4"
|
||||||
short_description: Uses Jinja2 to construct vars and groups based on existing inventory.
|
short_description: Uses Jinja2 to construct vars and groups based on existing inventory.
|
||||||
description:
|
description:
|
||||||
- Uses a YAML configuration file with a ``.config`` extension to define var expresisions and group conditionals
|
- Uses a YAML configuration file with a valid YAML or ``.config`` extension to define var expressions and group conditionals
|
||||||
- The Jinja2 conditionals that qualify a host for membership.
|
- The Jinja2 conditionals that qualify a host for membership.
|
||||||
- The JInja2 exprpessions are calculated and assigned to the variables
|
- The JInja2 exprpessions are calculated and assigned to the variables
|
||||||
- Only variables already available from previous inventories or the fact cache can be used for templating.
|
- Only variables already available from previous inventories or the fact cache can be used for templating.
|
||||||
|
@ -54,6 +54,9 @@ EXAMPLES = '''
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from collections import MutableMapping
|
||||||
|
|
||||||
|
from ansible import constants as C
|
||||||
from ansible.errors import AnsibleParserError
|
from ansible.errors import AnsibleParserError
|
||||||
from ansible.plugins.inventory import BaseInventoryPlugin
|
from ansible.plugins.inventory import BaseInventoryPlugin
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
@ -75,7 +78,7 @@ class InventoryModule(BaseInventoryPlugin):
|
||||||
if super(InventoryModule, self).verify_file(path):
|
if super(InventoryModule, self).verify_file(path):
|
||||||
file_name, ext = os.path.splitext(path)
|
file_name, ext = os.path.splitext(path)
|
||||||
|
|
||||||
if not ext or ext == '.config':
|
if not ext or ext in ['.config'] + C.YAML_FILENAME_EXTENSIONS:
|
||||||
valid = True
|
valid = True
|
||||||
|
|
||||||
return valid
|
return valid
|
||||||
|
@ -92,6 +95,8 @@ class InventoryModule(BaseInventoryPlugin):
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
raise AnsibleParserError("%s is empty" % (to_native(path)))
|
raise AnsibleParserError("%s is empty" % (to_native(path)))
|
||||||
|
elif not isinstance(data, MutableMapping):
|
||||||
|
raise AnsibleParserError('inventory source has invalid structure, it should be a dictionary, got: %s' % type(data))
|
||||||
elif data.get('plugin') != self.NAME:
|
elif data.get('plugin') != self.NAME:
|
||||||
raise AnsibleParserError("%s is not a constructed groups config file, plugin entry must be 'constructed'" % (to_native(path)))
|
raise AnsibleParserError("%s is not a constructed groups config file, plugin entry must be 'constructed'" % (to_native(path)))
|
||||||
|
|
||||||
|
|
|
@ -129,21 +129,18 @@ class InventoryModule(BaseInventoryPlugin):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise AnsibleParserError(e)
|
raise AnsibleParserError(e)
|
||||||
|
|
||||||
|
msg = ''
|
||||||
if not self._config_data:
|
if not self._config_data:
|
||||||
# empty. this is not my config file
|
msg = 'File empty. this is not my config file'
|
||||||
return False
|
elif 'plugin' in self._config_data and self._config_data['plugin'] != self.NAME:
|
||||||
if 'plugin' in self._config_data and self._config_data['plugin'] != self.NAME:
|
msg = 'plugin config file, but not for us: %s' % self._config_data['plugin']
|
||||||
# plugin config file, but not for us
|
|
||||||
return False
|
|
||||||
elif 'plugin' not in self._config_data and 'clouds' not in self._config_data:
|
elif 'plugin' not in self._config_data and 'clouds' not in self._config_data:
|
||||||
# it's not a clouds.yaml file either
|
msg = "it's not a plugin configuration nor a clouds.yaml file"
|
||||||
return False
|
elif not HAS_SHADE:
|
||||||
|
msg = "shade is required for the OpenStack inventory plugin. OpenStack inventory sources will be skipped."
|
||||||
|
|
||||||
if not HAS_SHADE:
|
if msg:
|
||||||
self.display.warning(
|
raise AnsibleParserError(msg)
|
||||||
'shade is required for the OpenStack inventory plugin.'
|
|
||||||
' OpenStack inventory sources will be skipped.')
|
|
||||||
return False
|
|
||||||
|
|
||||||
# The user has pointed us at a clouds.yaml file. Use defaults for
|
# The user has pointed us at a clouds.yaml file. Use defaults for
|
||||||
# everything.
|
# everything.
|
||||||
|
|
|
@ -173,7 +173,7 @@ class InventoryModule(BaseInventoryPlugin):
|
||||||
|
|
||||||
if not config_data or config_data.get('plugin') != self.NAME:
|
if not config_data or config_data.get('plugin') != self.NAME:
|
||||||
# this is not my config file
|
# this is not my config file
|
||||||
return False
|
raise AnsibleParserError("Incorrect plugin name in file: %s" % config_data.get('plugin', 'none found'))
|
||||||
|
|
||||||
source_data = None
|
source_data = None
|
||||||
if cache and cache_key in inventory.cache:
|
if cache and cache_key in inventory.cache:
|
||||||
|
|
|
@ -88,7 +88,11 @@ class InventoryModule(BaseFileInventoryPlugin):
|
||||||
raise AnsibleParserError(e)
|
raise AnsibleParserError(e)
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
return False
|
raise AnsibleParserError('Parsed empty YAML file')
|
||||||
|
elif not isinstance(data, MutableMapping):
|
||||||
|
raise AnsibleParserError('YAML inventory has invalid structure, it should be a dictionary, got: %s' % type(data))
|
||||||
|
elif data.get('plugin'):
|
||||||
|
raise AnsibleParserError('Plugin configuration YAML file, not YAML inventory')
|
||||||
|
|
||||||
# We expect top level keys to correspond to groups, iterate over them
|
# We expect top level keys to correspond to groups, iterate over them
|
||||||
# to get host, vars and subgroups (which we iterate over recursivelly)
|
# to get host, vars and subgroups (which we iterate over recursivelly)
|
||||||
|
|
Loading…
Reference in a new issue