fix environment validation, make setup exception

removed bare vars
now environment inheritance correclty prepends
this allows more local to override more general

fixes #23180
This commit is contained in:
Brian Coca 2017-04-06 22:19:56 -04:00 committed by Brian Coca
parent 729b0e3bee
commit df5895e585
2 changed files with 34 additions and 19 deletions

View file

@ -280,7 +280,7 @@ class Block(Base, Become, Conditional, Taggable):
dep.set_loader(loader)
def _get_attr_environment(self):
return self._get_parent_attribute('environment', extend=True)
return self._get_parent_attribute('environment', extend=True, prepend=True)
def _get_parent_attribute(self, attr, extend=False, prepend=False):
'''

View file

@ -21,7 +21,7 @@ __metaclass__ = type
import os
from ansible.errors import AnsibleError, AnsibleParserError
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable
from ansible.module_utils.six import iteritems, string_types
from ansible.module_utils._text import to_native
from ansible.parsing.mod_args import ModuleArgsParser
@ -258,25 +258,40 @@ class Task(Base, Conditional, Taggable, Become):
Override post validation of vars on the play, as we don't want to
template these too early.
'''
if value is None:
return dict()
env = {}
if value is not None:
elif isinstance(value, list):
if len(value) == 1:
return templar.template(value[0], convert_bare=True)
else:
env = []
print(value)
def _parse_env_kv(k, v):
try:
env[k] = templar.template(v, convert_bare=False)
except AnsibleUndefinedVariable as e:
if self.action in ('setup', 'gather_facts') and 'ansible_env' in to_native(e):
# ignore as fact gathering sets ansible_env
pass
if isinstance(value, list):
for env_item in value:
if isinstance(env_item, (string_types, AnsibleUnicode)) and env_item in templar._available_variables:
env[env_item] = templar.template(env_item, convert_bare=False)
if isinstance(env_item, dict):
for k in env_item:
_parse_env_kv(k, env_item[k])
else:
isdict = templar.template(env_item, convert_bare=False)
if isinstance(isdict, dict):
env.update(isdict)
else:
display.warning("could not parse environment value, skipping: %s" % value)
elif isinstance(value, dict):
# should not really happen
env = dict()
for env_item in value:
if isinstance(env_item, (string_types, AnsibleUnicode)) and env_item in templar._available_variables:
env[env_item] = templar.template(value[env_item], convert_bare=False)
_parse_env_kv(env_item, value[env_item])
else:
# at this point it should be a simple string, also should not happen
env = templar.template(value, convert_bare=False)
# at this point it should be a simple string
return templar.template(value, convert_bare=True)
return env
def _post_validate_changed_when(self, attr, value, templar):
'''
@ -410,7 +425,7 @@ class Task(Base, Conditional, Taggable, Become):
'''
Override for the 'tags' getattr fetcher, used from Base.
'''
return self._get_parent_attribute('environment', extend=True)
return self._get_parent_attribute('environment', extend=True, prepend=True)
def get_dep_chain(self):
if self._parent: