I have a list of dicts similar to this one:
addons_xml_settings:
- addon_name: addon1
settings:
- xpath: /settings/setting[@id='setting_name1']
value: "false"
- xpath: /settings/setting[@id='setting_name2']
value: "false"
- xpath: /settings/setting[@id='setting_name3']
value: "true"
- addon_name: addon2
settings:
- xpath: /settings/setting[@id='setting_name4']
value: "false"
- xpath: /settings/setting[@id='setting_name5']
value: "false"
- xpath: /settings/setting[@id='setting_name6']
value: "true"
- ...
I would like to filter the addons_xml_settings list based on addon_name value in order to be able to loop over the list of settings as follows:
- name: "Force settings values for addon2"
community.general.xml:
path: "/addons_settings/addon2/settings.xml"
xpath: "{{ xml_setting.xpath }}"
value: "{{ xml_setting.value | default(omit) }}"
loop: "{{ filtered_settings }}"
loop_control:
loop_var: xml_setting
In this task, filtered_settings is the resulting list after having filtered addons_xml_settings. For instance, if I filter on addon_name=addon2, I would like filtered_settings to have the following content:
filtered_settings:
- xpath: /settings/setting[@id='setting_name4']
value: "false"
- xpath: /settings/setting[@id='setting_name5']
value: "false"
- xpath: /settings/setting[@id='setting_name6']
value: "true"
I ended up with the following to achieve the expected result.
loop: "{{ addons_xml_settings | selectattr('addon_name', 'equalto', 'addon2') | first | dict2items | map(attribute='value') | last }}"
This works, but is it the right way to achieve it or is there a better / more optimal / more readable way to do it?