From c24c0f5f6b6000e91eaf2f763b75d6f71aaf24e0 Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Thu, 23 Jun 2016 09:17:06 -0500 Subject: [PATCH] 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 --- lib/ansible/playbook/base.py | 4 ++-- lib/ansible/plugins/filter/core.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py index 3e877ede91..be8b578a32 100644 --- a/lib/ansible/playbook/base.py +++ b/lib/ansible/playbook/base.py @@ -31,7 +31,7 @@ from ansible.compat.six import iteritems, string_types from jinja2.exceptions import UndefinedError -from ansible.errors import AnsibleParserError +from ansible.errors import AnsibleParserError, AnsibleUndefinedVariable from ansible.parsing.dataloader import DataLoader from ansible.playbook.attribute import Attribute, FieldAttribute from ansible.utils.boolean import boolean @@ -406,7 +406,7 @@ class Base: except (TypeError, ValueError) as e: 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()) - except UndefinedError as e: + except (AnsibleUndefinedVariable, UndefinedError) as e: 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." " The error was: %s" % (name,e), obj=self.get_ds()) diff --git a/lib/ansible/plugins/filter/core.py b/lib/ansible/plugins/filter/core.py index ea5bb67be8..9dc01042f2 100644 --- a/lib/ansible/plugins/filter/core.py +++ b/lib/ansible/plugins/filter/core.py @@ -68,7 +68,7 @@ class AnsibleJSONEncoder(json.JSONEncoder): if isinstance(o, HostVars): return dict(o) else: - return o + return json.JSONEncoder.default(o) def to_yaml(a, *args, **kw): '''Make verbose, human readable yaml'''