diff --git a/lib/ansible/inventory/script.py b/lib/ansible/inventory/script.py index 8b2e4619a9..e43cf24972 100644 --- a/lib/ansible/inventory/script.py +++ b/lib/ansible/inventory/script.py @@ -84,10 +84,14 @@ class InventoryScript(object): if not isinstance(data, dict): data = {'hosts': data} + # is not those subkeys, then simplified syntax, host with vars elif not any(k in data for k in ('hosts','vars')): data = {'hosts': [group_name], 'vars': data} if 'hosts' in data: + if not isinstance(data['hosts'], list): + raise errors.AnsibleError("You defined a group \"%s\" with bad " + "data for the host list:\n %s" % (group_name, data)) for hostname in data['hosts']: if not hostname in all_hosts: @@ -96,6 +100,10 @@ class InventoryScript(object): group.add_host(host) if 'vars' in data: + if not isinstance(data['vars'], dict): + raise errors.AnsibleError("You defined a group \"%s\" with bad " + "data for variables:\n %s" % (group_name, data)) + for k, v in data['vars'].iteritems(): if group.name == all.name: all.set_variable(k, v) diff --git a/lib/ansible/utils/__init__.py b/lib/ansible/utils/__init__.py index c18174b00d..1e6a5383c0 100644 --- a/lib/ansible/utils/__init__.py +++ b/lib/ansible/utils/__init__.py @@ -696,12 +696,23 @@ def parse_kv(args): options[k.strip()] = unquote(v.strip()) return options +def _validate_both_dicts(a, b): + + if not (isinstance(a, dict) and isinstance(b, dict)): + raise errors.AnsibleError( + "failed to combine variables, expected dicts but got a '%s' and a '%s'" % (type(a).__name__, type(b).__name__) + ) + def merge_hash(a, b): ''' recursively merges hash b into a keys from b take precedence over keys from a ''' result = {} + # we check here as well as in combine_vars() since this + # function can work recursively with nested dicts + _validate_both_dicts(a, b) + for dicts in a, b: # next, iterate over b keys and values for k, v in dicts.iteritems(): @@ -1308,6 +1319,8 @@ def listify_lookup_plugin_terms(terms, basedir, inject): def combine_vars(a, b): + _validate_both_dicts(a, b) + if C.DEFAULT_HASH_BEHAVIOUR == "merge": return merge_hash(a, b) else: