fixes issue where filter wouldn't error on undefined var (#30921)

The filter will now correctly error on an undefined variable when trying
to template the key `value`
pull/30840/merge
Peter Sprygada 7 years ago committed by GitHub
parent 932f62ab57
commit 909100bd2c

@ -35,7 +35,7 @@ from ansible.module_utils.six import iteritems, string_types
from ansible.module_utils.basic import AnsibleFallbackNotFound
try:
from jinja2 import Environment
from jinja2 import Environment, StrictUndefined
from jinja2.exceptions import UndefinedError
HAS_JINJA2 = True
except ImportError:
@ -376,11 +376,12 @@ class Template:
raise ImportError("jinja2 is required but does not appear to be installed. "
"It can be installed using `pip install jinja2`")
self.env = Environment()
self.env = Environment(undefined=StrictUndefined)
self.env.filters.update({'ternary': ternary})
def __call__(self, value, variables=None, fail_on_undefined=True):
variables = variables or {}
if not self.contains_vars(value):
return value
@ -399,13 +400,6 @@ class Template:
else:
return None
def can_template(self, tmpl):
try:
self(tmpl)
return True
except:
return False
def contains_vars(self, data):
if isinstance(data, string_types):
for marker in (self.env.block_start_string, self.env.variable_start_string, self.env.comment_start_string):

@ -87,9 +87,11 @@ def parse_cli(output, tmpl):
for name, attrs in iteritems(spec['keys']):
value = attrs['value']
if template.can_template(value):
try:
variables = spec.get('vars', {})
value = template(value, variables)
except:
pass
if 'start_block' in attrs and 'end_block' in attrs:
start_block = re.compile(attrs['start_block'])

Loading…
Cancel
Save