Default filter and dictionary values

I am having an issue with the default value not being honored for an undefined dictionary. For example, if the setup is as follows

- name: something
file:
path: /somepath
owner: “{{ dir[‘owner’] | default(‘root’) }}”

and I have a variable of

dir:
owner: someowner

when I run this, a file called /somepath is created with the owner someowner, as expected. However, if the dictionary dir does not exist, I get an error of

"the field ‘args’ has an invalid value, which appears to include a variable that is undefined. The error was: ‘dir’ is undefined

instead of running with the default as I would have expected. if I flatten the variable structure to be

dir_owner: someowner

and change the task to be

- name: something
file:
path: /somepath
owner: “{{ dir_owner | default(‘root’) }}”

this works as expected. The owner of the file is either someowner if defined or root if not.

You have to default at every step, default is only applied to the deepest level specified, so if dir is undefined, you would have to apply default on dir directly too.

Maybe something like:

(dir|default({}))[‘owner’]|default(‘root’)

or making some assumptions that dir will either be defined or not, and when defined it will have owner:

(dir|default(dict(owner=‘root’)))[‘owner’]

You rock, figured it had to be something like that but couldn’t find any docs on it. Thanks!