diff --git a/changelogs/fragments/48792-templar-fix-AttributeError.yml b/changelogs/fragments/48792-templar-fix-AttributeError.yml new file mode 100644 index 00000000000..0a69b936f37 --- /dev/null +++ b/changelogs/fragments/48792-templar-fix-AttributeError.yml @@ -0,0 +1,2 @@ +bugfixes: + - Fix AttributeError (Python 3 only) when an exception occurs while rendering a template diff --git a/lib/ansible/template/vars.py b/lib/ansible/template/vars.py index a645aafadee..716e410f616 100644 --- a/lib/ansible/template/vars.py +++ b/lib/ansible/template/vars.py @@ -108,7 +108,7 @@ class AnsibleJ2Vars(Mapping): except AnsibleUndefinedVariable: raise except Exception as e: - msg = getattr(e, 'message') or to_native(e) + msg = getattr(e, 'message', None) or to_native(e) raise AnsibleError("An unhandled exception occurred while templating '%s'. " "Error was a %s, original message: %s" % (to_native(variable), type(e), msg)) diff --git a/test/units/template/test_templar.py b/test/units/template/test_templar.py index cbc1417c44e..3e9eb66627c 100644 --- a/test/units/template/test_templar.py +++ b/test/units/template/test_templar.py @@ -50,6 +50,7 @@ class BaseTemplar(object): some_unsafe_var=wrap_var("unsafe_blip"), some_static_unsafe_var=wrap_var("static_unsafe_blip"), some_unsafe_keyword=wrap_var("{{ foo }}"), + str_with_error="{{ 'str' | from_json }}", ) self.fake_loader = DictDataLoader({ "/path/to/my_file.txt": "foo\n", @@ -200,6 +201,10 @@ class TestTemplarTemplate(BaseTemplar, unittest.TestCase): self.templar.template, data) + def test_template_with_error(self): + """Check that AnsibleError is raised, fail if an unhandled exception is raised""" + self.assertRaises(AnsibleError, self.templar.template, "{{ str_with_error }}") + class TestTemplarCleanData(BaseTemplar, unittest.TestCase): def test_clean_data(self):