Properly wrap objects using json default encoder
Our custom encoder for the to_json filter was simply returning the
object if it was not a HostVars object, leading in some cases to a
TypeError when the data contained an undefined variable. This lead
to an odd error message being propagated up, so we now properly catch
this as an undefined variable error.
Fixes #15610
(cherry picked from commit c24c0f5f6b
)
This commit is contained in:
parent
cb520bd86a
commit
7da2265e10
2 changed files with 3 additions and 3 deletions
|
@ -31,7 +31,7 @@ from ansible.compat.six import iteritems, string_types
|
||||||
|
|
||||||
from jinja2.exceptions import UndefinedError
|
from jinja2.exceptions import UndefinedError
|
||||||
|
|
||||||
from ansible.errors import AnsibleParserError
|
from ansible.errors import AnsibleParserError, AnsibleUndefinedVariable
|
||||||
from ansible.parsing.dataloader import DataLoader
|
from ansible.parsing.dataloader import DataLoader
|
||||||
from ansible.playbook.attribute import Attribute, FieldAttribute
|
from ansible.playbook.attribute import Attribute, FieldAttribute
|
||||||
from ansible.utils.boolean import boolean
|
from ansible.utils.boolean import boolean
|
||||||
|
@ -386,7 +386,7 @@ class Base:
|
||||||
except (TypeError, ValueError) as e:
|
except (TypeError, ValueError) as e:
|
||||||
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s."
|
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s."
|
||||||
" Error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
|
" Error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
|
||||||
except UndefinedError as e:
|
except (AnsibleUndefinedVariable, UndefinedError) as e:
|
||||||
if templar._fail_on_undefined_errors and name != 'name':
|
if templar._fail_on_undefined_errors and name != 'name':
|
||||||
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined."
|
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined."
|
||||||
" The error was: %s" % (name,e), obj=self.get_ds())
|
" The error was: %s" % (name,e), obj=self.get_ds())
|
||||||
|
|
|
@ -68,7 +68,7 @@ class AnsibleJSONEncoder(json.JSONEncoder):
|
||||||
if isinstance(o, HostVars):
|
if isinstance(o, HostVars):
|
||||||
return dict(o)
|
return dict(o)
|
||||||
else:
|
else:
|
||||||
return o
|
return json.JSONEncoder.default(o)
|
||||||
|
|
||||||
def to_yaml(a, *args, **kw):
|
def to_yaml(a, *args, **kw):
|
||||||
'''Make verbose, human readable yaml'''
|
'''Make verbose, human readable yaml'''
|
||||||
|
|
Loading…
Reference in a new issue