Q: "Find the initial variable and print the path to it like author.fistname.initial"
A: Use the dictionaries below. There might be more paths. For example, given the data
data:
- isbn: 123-456-222
author:
lastname: Doe
firstname:
name: John
initial: D
- isbn: 123-456-333
author:
lastname: Doe
firstname:
name: Alice
initial: C
- isbn: 123-456-444
author:
lastname: Doe
firstname:
name: Bob
initial: D
- The task creates the dictionary initials
- name: Create dictionary initials
set_fact:
initials: "{{ initials|d({})|combine({item: authors}) }}"
loop: "{{ data|json_query('[].*.*.initial')|flatten|unique }}"
vars:
authors: "{{ data|
selectattr('author.firstname.initial', 'eq', item)|
json_query('[].join(`,`,[author.lastname,
author.firstname.name,
author.firstname.initial])') }}"
gives
initials:
C:
- Doe,Alice,C
D:
- Doe,John,D
- Doe,Bob,D
- The task creates the dictionary paths
- name: Create dictionary paths
set_fact:
paths: "{{ paths|d({})|combine(_item, list_merge='append') }}"
loop: "{{ data }}"
vars:
_paths: "{{ lookup('ansible.utils.to_paths', item) }}"
_item: "{{ dict(_paths|dict2items|json_query('[].[value, [key]]')) }}"
gives
paths:
123-456-222:
- isbn
123-456-333:
- isbn
123-456-444:
- isbn
Alice:
- author.firstname.name
Bob:
- author.firstname.name
C:
- author.firstname.initial
D:
- author.firstname.initial
- author.firstname.initial
Doe:
- author.lastname
- author.lastname
- author.lastname
John:
- author.firstname.name
- Filter unique paths. Create dictionary paths_unique
paths_keys: "{{ paths.keys()|list }}"
paths_vals: "{{ paths.values()|map('unique')|list }}"
paths_unique: "{{ dict(paths_keys|zip(paths_vals)) }}"
gives
paths_unique:
123-456-222:
- isbn
123-456-333:
- isbn
123-456-444:
- isbn
Alice:
- author.firstname.name
Bob:
- author.firstname.name
C:
- author.firstname.initial
D:
- author.firstname.initial
Doe:
- author.lastname
John:
- author.firstname.name
Example of a complete playbook for testing
- hosts: localhost
vars:
data:
- isbn: 123-456-222
author:
lastname: Doe
firstname:
name: John
initial: D
- isbn: 123-456-333
author:
lastname: Doe
firstname:
name: Alice
initial: C
- isbn: 123-456-444
author:
lastname: Doe
firstname:
name: Bob
initial: D
paths_keys: "{{ paths.keys()|list }}"
paths_vals: "{{ paths.values()|map('unique')|list }}"
paths_unique: "{{ dict(paths_keys|zip(paths_vals)) }}"
tasks:
- name: Create dictionary initials
set_fact:
initials: "{{ initials|d({})|combine({item: authors}) }}"
loop: "{{ data|json_query('[].*.*.initial')|flatten|unique }}"
vars:
authors: "{{ data|
selectattr('author.firstname.initial', 'eq', item)|
json_query('[].join(`,`,[author.lastname,
author.firstname.name,
author.firstname.initial])') }}"
- debug:
var: initials
- name: Create dictionary paths
set_fact:
paths: "{{ paths|d({})|combine(_item, list_merge='append') }}"
loop: "{{ data }}"
vars:
_paths: "{{ lookup('ansible.utils.to_paths', item) }}"
_item: "{{ dict(_paths|dict2items|json_query('[].[value, [key]]')) }}"
- debug:
var: paths
- debug:
var: paths_unique