🌐
Ansible
docs.ansible.com › projects › ansible › latest › playbook_guide › complex_data_manipulation.html
Manipulating data — Ansible Community Documentation
Use selectattr to filter mounts into the list I can then sort and select the last from · - hosts: all gather_facts: True vars: path: /var/lib/cache tasks: - name: The mount point for {{path}}, found using the Ansible mount facts, [-1] is the same as the 'last' filter ansible.builtin.debug: msg: "{{(ansible_facts.mounts | selectattr('mount', 'in', path) | list | sort(attribute='mount'))[-1]['mount']}}"
🌐
Network to Code
networktocode.com › home › manipulating data with jinja map and selectattr
Manipulating Data with Jinja Map and Selectattr - Network to Code
October 15, 2024 - Manipulating data with the Jinja filters, Map, Selectattr, and Select provides quick and efficient ways to create new data structures. This can simplify creating lookup dictionaries and avoids complex loops or Jinja templating options. In many instances in ansible, I’ll use an ordered list ...
🌐
Middleware Inventory
middlewareinventory.com › blog › ansible-selectattr-example
Ansible selectattr Example - Filter dictionary and select matching item
February 24, 2024 - Ansible selectattr filter is to select matching objects from the dictionary by applying a test across all the objects in a dictionary/sequence.
🌐
AnsiblePilot
ansiblepilot.com › articles › filtering-data-in-ansible-selectattr-and-map
Filtering Data in Ansible: selectattr and map(attribute)
January 29, 2025 - msg: "{{ (variable | selectattr('name', 'equalto', search_name) | map(attribute='folder') | list).0 }}"
🌐
Tailored Cloud
tailored.cloud › home › advanced list operations in ansible
Advanced list operations in Ansible. selectattr, sum, map and others.
March 16, 2018 - The problem can be solved with the following ansible code. Let’s first have a look and then I will explain it step by step: # file playbook.yml - hosts: all tasks: - set_fact: test_ip: "{{ interfaces | selectattr('name', 'match', 'eth[2-9]') | sum(attribute='ips', start=[]) | selectattr('owner', 'equalto', 'TEST') | map(attribute='ip') | list | first | default('NOT_FOUND') }}" - debug: msg: "The TEST IP is {{ test_ip }}"
🌐
How to Use Linux
howtouselinux.com › home › selectattr in ansible
selectattr in Ansible - howtouselinux
October 9, 2025 - selectattr in Ansible selectattr is a filter plugin in Ansible that allows you to select a subset of elements from a list of dictionaries based on the value of a particular attribute. Its syntax is as follows: | selectattr(' ', ' ', ' ') Key Description list_of_dictionaries A list of dictionaries ...
🌐
Packetswitch
packetswitch.co.uk › ansible-selectattr-filter
How to use Ansible 'selectattr' Filter?
September 21, 2024 - 'selectattr' filter is a feature within Jinja2 that enables filtering a list of objects based on an attribute's presence or value. Let's look at a few examples to better understand this filter.
Find elsewhere
🌐
Red Hat
redhat.com › en › blog › ansible-jinja-lists-dictionaries
How to work with a list of dictionaries in Ansible
November 24, 2025 - selectattr() filters a sequence of objects by applying a test to the specified attribute of each object and only selecting the objects when the test succeeds. map() applies a filter on a sequence of objects or looks up an attribute.
Top answer
1 of 2
8

Is selectattr filter expecting all the dicts in the list to have the same keys?

More precisely, it is expecting all dicts in the list to have the attribute you are selecting on. If not all dict in the list have it, you will have to first filter out the items where it is not defined. This can be done with selectattr as well. (thanks @Randy for making this clearer since my initial answer).

In your situation, the json_query filter (which implements jmespath) can also do the job in sometimes a more compact manner. But it is not a core filter and requires to have the community.general collection installed.

Here are a few examples taken from your above requirements solved with both core filters and json_query solutions.

The playbook:

---
- name: "Filter data with core filters or json query"
  hosts: "localhost"
  gather_facts: false

  vars:
    # Your initial data on a single line for legibility
    test_var: [{"vm":"vm1","ip":"10.10.10.1"},{"vm":"vm2","ip":"10.10.10.2"},{"test_vm":"something","process_1":"X","process_2":"Y","process_3":"Z"},{"another_vm":"something_other"}]

  tasks:
    - name: Get objects having vm==vm1
      vars:
        msg: |-
          With core filters: {{ test_var | selectattr('vm', 'defined') | selectattr('vm', '==', 'vm1') | list }}
          With json_query: {{ test_var | json_query("[?vm=='vm1']") | list }}
      debug:
        msg: "{{ msg.split('\n') }}"

    - name: Get all objects having vm attribute
      vars:
        msg: |-
          With core filters: {{ test_var | selectattr('vm', 'defined') | list }}
          With json_query: {{ test_var | json_query("[?vm]") | list }}
      debug:
        msg: "{{ msg.split('\n') }}"

    - name: Get all objects having process_2 attribute
      vars:
        msg: |-
          With core filters: {{ test_var | selectattr('process_2', 'defined') | list }}
          With json_query: {{ test_var | json_query("[?process_2]") | list }}
      debug:
        msg: "{{ msg.split('\n') }}"

    - name: Get only a list of process_2 attributes
      vars:
        msg: |-
          With core filters: {{ test_var | selectattr('process_2', 'defined') | map(attribute='process_2') | list }}
          With json_query: {{ test_var | json_query("[].process_2") | list }}
      debug:
        msg: "{{ msg.split('\n') }}"

which gives:

PLAY [Filter data with core filters or json query] *********************************************************************

TASK [Get objects having vm==vm1] *********************************************************************
ok: [localhost] => {
    "msg": [
        "With core filters: [{'vm': 'vm1', 'ip': '10.10.10.1'}]",
        "With json_query: [{'vm': 'vm1', 'ip': '10.10.10.1'}]"
    ]
}

TASK [Get all objects having vm attribute] *********************************************************************
ok: [localhost] => {
    "msg": [
        "With core filters: [{'vm': 'vm1', 'ip': '10.10.10.1'}, {'vm': 'vm2', 'ip': '10.10.10.2'}]",
        "With json_query: [{'vm': 'vm1', 'ip': '10.10.10.1'}, {'vm': 'vm2', 'ip': '10.10.10.2'}]"
    ]
}

TASK [Get all objects having process_2 attribute] *********************************************************************
ok: [localhost] => {
    "msg": [
        "With core filters: [{'test_vm': 'something', 'process_1': 'X', 'process_2': 'Y', 'process_3': 'Z'}]",
        "With json_query: [{'test_vm': 'something', 'process_1': 'X', 'process_2': 'Y', 'process_3': 'Z'}]"
    ]
}

TASK [Get only a list of process_2 attributes] *********************************************************************
ok: [localhost] => {
    "msg": [
        "With core filters: ['Y']",
        "With json_query: ['Y']"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
2 of 2
8

To complement this edit of Zeitounator's answer:

More precisely, it is expecting all dicts in the list to have the attribute you are selecting on.

It is not 100% true for all filter functions, to select objects by an attribute not defined by all elements:

{{ test_var | selectattr('vm','defined') |selectattr('vm','equalto','vm1') | list }} 
Top answer
1 of 1
1

Create a dictionary of usernames and their visibility. For example, given the below data for testing

  result:
    json:
      - {username: mike, visibility: private}
      - {username: alice, visibility: public}
      - {username: bob, visibility: top secret}

Declare the dictionary

  username_visibility: "{{ result.json|
                           items2dict(key_name='username',
                                      value_name='visibility') }}"

gives

  username_visibility:
    alice: public
    bob: top secret
    mike: private

Now, the testing is trivial

  username_visibility.mike == 'private'

Example of a complete playbook for testing

shell> cat pb.yml
- hosts: localhost

  vars:

    result:
      json:
        - {username: mike, visibility: private}
        - {username: alice, visibility: public}
        - {username: bob, visibility: top secret}

    username_visibility: "{{ result.json|
                             items2dict(key_name='username',
                                        value_name='visibility') }}"

  tasks:

    - debug:
        var: username_visibility

    - assert:
        that: username_visibility.mike == 'private'

gives

shell> ansible-playbook pb.yml

PLAY [localhost] *****************************************************************************

TASK [debug] *********************************************************************************
ok: [localhost] => 
  username_visibility:
    alice: public
    bob: top secret
    mike: private

TASK [assert] ********************************************************************************
ok: [localhost] => changed=false 
  msg: All assertions passed

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Top answer
1 of 1
4

You are using the select filter wrongly with rather weird argument (I suspect a copy/paste error but I'm not sure). select will apply a test to each object in the list. I don't know any search test that can be applied to a hashmap (The closest I can think of is the python search method of an re -i.e. regexp- object which would not be appropriate anyway)

In your case, you are looking for a specific value of an attribute of your hashmap. This can be done with the selectattr filter which will apply a test to a given attribute of the objects in the list and return only the ones passing the test.

There is a different approach to your problem which is more compact IMO using the json_query filter

Below is an example playbook using both approaches leading to the same result.

---
- name: Sum size of FS
  hosts: localhost
  gather_facts: false

  vars:
    FS:
      - nom_FS: /appm/oracle/product
        nom_LV: lv_product
        size_FS: 5
        owner_FS: oracle
        group_FS: dba
        vg_name: vgapplis

      - nom_FS: /appm/oracle/product/12.1.0.2
        nom_LV: lv_12102
        size_FS: 15
        owner_FS: oracle
        group_FS: dba
        vg_name: vgapplis

      - nom_FS: /apps/oracle/logs
        nom_LV: lvlogs
        size_FS: 5
        owner_FS: oracle
        group_FS: dba
        vg_name: vglogs

  tasks:

    - name: Calculate with selectattr, map and sum
      debug:
        msg: "{{ FS | selectattr('vg_name', '==', 'vgapplis') | map(attribute='size_FS') | list | sum }}"

    - name: Calculate with json_query
      vars:
        sum_query: "[?vg_name=='vgapplis'].size_FS | sum(@)"
      debug:
        msg: "{{ FS | json_query(sum_query) }}"

And the result

PLAY [Sum size of FS] ****************************************************************

TASK [Calculate with selectattr, map and sum] ****************************************
ok: [localhost] => {
    "msg": "20"
}

TASK [Calculate with json_query] *****************************************************
ok: [localhost] => {
    "msg": "20"
}

PLAY RECAP ***************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
🌐
Oznetnerd
oznetnerd.com › 2017 › 04 › 18 › jinja2-selectattr-filter
Jinja2 selectattr() Filter - OzNetNerd.com
April 17, 2017 - - set_fact: emails: "{{ users | selectattr('password', 'undefined') | map(attribute='email') | list }}"
🌐
0xf8
0xf8.org › 2021 › 03 › filtering-with-ansibles-selectattr-rejectattr-when-the-tested-attribute-can-be-absent
Filtering with Ansible’s selectattr()/rejectattr() when the tested attribute can be absent – 0xf8.org
March 19, 2021 - {{ fruit | selectattr('or', 'origin', 'not', 'defined', 'origin', 'equalto', 'exotic') }} # selectattr/rejectattr do not support brackets either {{ fruit | selectattr('or'(('origin', 'not', 'defined'), ('origin', 'equalto', 'exotic'))) }}
🌐
OneUptime
oneuptime.com › home › blog › how to use the selectattr and rejectattr filters in ansible
How to Use the selectattr and rejectattr Filters in Ansible
February 21, 2026 - When you have a list of dictionaries ... list based on the value of a specific attribute. The selectattr filter keeps items where an attribute passes a test, and rejectattr removes items where an attribute passes a test...
🌐
Educative
educative.io › answers › how-to-filter-a-list-by-its-attributes-in-ansible
How to filter a list by its attributes in Ansible
To filter a list in Ansible by its attributes, you can use the selectattr filter. selectattr is a filtering function in Ansible used to select items from a list of dictionaries based on the attributes' values of those dictionaries.
🌐
Linux Hint
linuxhint.com › ansible-selectattr-rejectattr
Ansible Selectattr/Rejectattr – Linux Hint
The selectattr stands for select attribute filter. Each select attribute is used to perform testing on each object that is a defined attribute and only picking those that pass the testing filters, is a succession of items. The result of the select attribute would be assessed as a boolean even ...
🌐
Reddit
reddit.com › r/ansible › how do i exclude 'null" from selectattr and map?
r/ansible on Reddit: How do I exclude 'null" from selectattr and map?
April 12, 2023 -

Got the following from using selectattr and map. I would like to just get the drive letters themselves from some windows facts. My end goal is to match the drive letter to the physical drive on the server. The null part is stumping me at this point.

    "windows_disk_facts['ansible_facts.disks']|selectattr('partitions','defined')|map(attribute='partitions')|flatten|selectattr('drive_letter','defined')|map(attribute='drive_letter')|reject('==',0)|list": [
        null,
        "C",
        null,
        null,
        "E",
        null,
        "F"
    ]
}

I've tried using various combinations, but null is throwing me off. If someone already has some existing code to match drive to physical device I'll gladly take that. I'd really like to know how to skip null for the future in general as well though. TIA.

🌐
GitHub
gist.github.com › dudebowski › 2cc2ecc57c447231a8924a4ed2ddd4ab
Select items from lists in Ansible · GitHub
Select items from lists in Ansible. GitHub Gist: instantly share code, notes, and snippets.