diff --git a/changelogs/fragments/jinja2_nested_undefined_getitem.yaml b/changelogs/fragments/jinja2_nested_undefined_getitem.yaml new file mode 100644 index 0000000000..27c6865fbd --- /dev/null +++ b/changelogs/fragments/jinja2_nested_undefined_getitem.yaml @@ -0,0 +1,2 @@ +minor_changes: +- jinja2 - accesses to keys/indices on an undefined value now return further undefined values rather than throwing an exception diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index a3e6af1062..c5256c218c 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -207,6 +207,10 @@ class AnsibleUndefined(StrictUndefined): # Return original Undefined object to preserve the first failure context return self + def __getitem__(self, key): + # Return original Undefined object to preserve the first failure context + return self + def __repr__(self): return 'AnsibleUndefined' diff --git a/test/integration/targets/template/tasks/main.yml b/test/integration/targets/template/tasks/main.yml index 64d08fe32c..6fd25e1095 100644 --- a/test/integration/targets/template/tasks/main.yml +++ b/test/integration/targets/template/tasks/main.yml @@ -666,6 +666,24 @@ - list_var.0.foo.bar | default('DEFAULT') == 'DEFAULT' - list_var.1.foo is not defined - list_var.1.foo | default('DEFAULT') == 'DEFAULT' + - dict_var is defined + - dict_var['bar'] is defined + - dict_var['bar']['baz'] is not defined + - dict_var['bar']['baz'] | default('DEFAULT') == 'DEFAULT' + - dict_var['bar']['baz']['abc'] is not defined + - dict_var['bar']['baz']['abc'] | default('DEFAULT') == 'DEFAULT' + - dict_var['baz'] is not defined + - dict_var['baz']['abc'] is not defined + - dict_var['baz']['abc'] | default('DEFAULT') == 'DEFAULT' + - list_var[0] is defined + - list_var[1] is not defined + - list_var[0]['foo'] is defined + - list_var[0]['foo']['bar'] is not defined + - list_var[0]['foo']['bar'] | default('DEFAULT') == 'DEFAULT' + - list_var[1]['foo'] is not defined + - list_var[1]['foo'] | default('DEFAULT') == 'DEFAULT' + - dict_var['bar'].baz is not defined + - dict_var['bar'].baz | default('DEFAULT') == 'DEFAULT' - template: src: template_destpath_test.j2