# selectattr on dict not working as expected

**URL:** <https://forum.ansible.com/t/selectattr-on-dict-not-working-as-expected/28409>\
**Category:** Ansible Project\
**Created:** [August 23, 2018, 7:03pm UTC](https://forum.ansible.com/t/selectattr-on-dict-not-working-as-expected/28409 "2018-08-23T19:03:14Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![justin1](https://avatars.discourse-cdn.com/v4/letter/j/ea5d25/32.png) [@justin1](https://forum.ansible.com/u/justin1)\
**Post date:** [August 23, 2018, 7:03pm UTC](https://forum.ansible.com/t/selectattr-on-dict-not-working-as-expected/28409/1 "2018-08-23T19:03:14Z")

</div>

I have a dict that looks like:

`

TASK [debug vpc\_subnet\_facts.subnets] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
ok: [localhost] =\> {  
“msg”: [  
{  
“assign\_ipv6\_address\_on\_creation”: false,  
“availability\_zone”: “us-west-1a”,  
“available\_ip\_address\_count”: 250,  
“cidr\_block”: “10.0.1.0/24”,  
“default\_for\_az”: false,  
“id”: “subnet-030ff449eaea87042”,  
“ipv6\_cidr\_block\_association\_set”: ,  
“map\_public\_ip\_on\_launch”: false,  
“state”: “available”,  
“subnet\_id”: “subnet-030ff449eaea87042”,  
“tags”: {  
“Name”: “private-a”  
},  
“vpc\_id”: “vpc-0a8c42654fe5f4a2b”  
},  
{  
“assign\_ipv6\_address\_on\_creation”: false,  
“availability\_zone”: “us-west-1a”,  
“available\_ip\_address\_count”: 251,  
“cidr\_block”: “10.0.2.0/24”,  
“default\_for\_az”: false,  
“id”: “subnet-0e2db57655e833a66”,  
“ipv6\_cidr\_block\_association\_set”: ,  
“map\_public\_ip\_on\_launch”: false,  
“state”: “available”,  
“subnet\_id”: “subnet-0e2db57655e833a66”,  
“tags”: {  
“Name”: “public-a”  
},  
“vpc\_id”: “vpc-0a8c42654fe5f4a2b”  
},  
{  
“assign\_ipv6\_address\_on\_creation”: false,  
“availability\_zone”: “us-west-1c”,  
“available\_ip\_address\_count”: 251,  
“cidr\_block”: “10.0.5.0/24”,  
“default\_for\_az”: false,  
“id”: “subnet-060df17f2871364d2”,  
“ipv6\_cidr\_block\_association\_set”: ,  
“map\_public\_ip\_on\_launch”: false,  
“state”: “available”,  
“subnet\_id”: “subnet-060df17f2871364d2”,  
“tags”: {  
“Name”: “private-c”  
},  
“vpc\_id”: “vpc-0a8c42654fe5f4a2b”  
},  
{  
“assign\_ipv6\_address\_on\_creation”: false,  
“availability\_zone”: “us-west-1c”,  
“available\_ip\_address\_count”: 251,  
“cidr\_block”: “10.0.6.0/24”,  
“default\_for\_az”: false,  
“id”: “subnet-0dd9ab6af6ec05f83”,  
“ipv6\_cidr\_block\_association\_set”: ,  
“map\_public\_ip\_on\_launch”: false,  
“state”: “available”,  
“subnet\_id”: “subnet-0dd9ab6af6ec05f83”,  
“tags”: {  
“Name”: “public-c”  
},  
“vpc\_id”: “vpc-0a8c42654fe5f4a2b”  
}  
]  
}

`

and I’m attempting to extract subnet\_id for only public subnets like so:

`

- name: set public vpc subnets  
set\_fact:  
vpc\_public\_subnet\_ids: “{{ item | selectattr(‘Name’, ‘search’, ‘public.+’) | map(attribute=‘subnet\_id’) | list }}”  
loop: “{{ vpc\_subnet\_facts.subnets }}”

`

I’ve tried a number of ways to filter out this information but to no avail. The most common error is **“Unexpected templating type error occurred on ({{ item | selectattr(‘Name’, ‘search’, ‘public.+’) | map(attribute=‘subnet\_id’) | list }}): expected string or buffer”}"**  
I feel as if I’m making some rather basic mistake here. Any help is appreciated.

---

<div class="post-metadata">

**Author:** ![Kai\_Stian\_Olstad](https://avatars.discourse-cdn.com/v4/letter/k/e19adc/32.png) [@Kai\_Stian\_Olstad](https://forum.ansible.com/u/Kai_Stian_Olstad)\
**Post date:** [August 23, 2018, 8:53pm UTC](https://forum.ansible.com/t/selectattr-on-dict-not-working-as-expected/28409/2 "2018-08-23T20:53:01Z")

</div>

> I have a dict that looks like:
> 
> &nbsp;&nbsp;&nbsp;&nbsp;"msg": [  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"assign\_ipv6\_address\_on\_creation": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"availability\_zone": "us-west-1a",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"available\_ip\_address\_count": 250,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"cidr\_block": "10.0.1.0/24",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"default\_for\_az": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"id": "subnet-030ff449eaea87042",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ipv6\_cidr\_block\_association\_set": ,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"map\_public\_ip\_on\_launch": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"state": "available",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"subnet\_id": "subnet-030ff449eaea87042",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"tags": {  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Name": "private-a"  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"vpc\_id": "vpc-0a8c42654fe5f4a2b"  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"assign\_ipv6\_address\_on\_creation": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"availability\_zone": "us-west-1a",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"available\_ip\_address\_count": 251,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"cidr\_block": "10.0.2.0/24",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"default\_for\_az": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"id": "subnet-0e2db57655e833a66",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ipv6\_cidr\_block\_association\_set": ,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"map\_public\_ip\_on\_launch": false,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"state": "available",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"subnet\_id": "subnet-0e2db57655e833a66",  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"tags": {  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Name": "public-a"  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"vpc\_id": "vpc-0a8c42654fe5f4a2b"  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},

\<snip /\>

> and I'm attempting to extract subnet\_id for only public subnets like so:
> 
> - name: set public vpc subnets  
> &nbsp;&nbsp;set\_fact:  
> &nbsp;&nbsp;&nbsp;&nbsp;vpc\_public\_subnet\_ids: "{{ item | selectattr('Name', 'search',  
> 'public.+') | map(attribute='subnet\_id') | list }}"  
> &nbsp;&nbsp;loop: "{{ vpc\_subnet\_facts.subnets }}"
> 
> I've tried a number of ways to filter out this information but to no avail.  
> The most common error is \*"Unexpected templating type error occurred on ({{  
> item | selectattr('Name', 'search', 'public.+') |  
> map(attribute='subnet\_id') | list }}): expected string or buffer"}"\*  
> I feel as if I'm making some rather basic mistake here. Any help is  
> appreciated.

selectattr only works on list not dicts.  
And you don't have a Name at that level only tags.Name

So this should work

&nbsp;&nbsp;- name: set public vpc subnets  
&nbsp;&nbsp;&nbsp;&nbsp;set\_fact:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vpc\_public\_subnet\_ids: "{{ vpc\_subnet\_facts.subnets | selectattr('tags.Name', 'search', 'public.+') | map(attribute='subnet\_id') | list }}"

So you where very close to find the solution.

---

<div class="post-metadata">

**Author:** ![justin1](https://avatars.discourse-cdn.com/v4/letter/j/ea5d25/32.png) [@justin1](https://forum.ansible.com/u/justin1)\
**Post date:** [August 23, 2018, 9:05pm UTC](https://forum.ansible.com/t/selectattr-on-dict-not-working-as-expected/28409/3 "2018-08-23T21:05:31Z")

</div>

I see what I was doing wrong. Thanks for this, your solution worked.
