List of dicts => dict of lists

68 views
Skip to first unread message

Dick Visser

unread,
Nov 22, 2019, 12:44:01 PM11/22/19
to ansible...@googlegroups.com
Hi

I'm struggling with something seemingly simple.
I have this list:

instances:
- id: i-0fe48c061f6a323a0
type: web
- id: i-0403e39813defda31
type: web
- id: i-0442f13b528e5e1c6
type: proxy
- id: i-0ebea75d008becaa6
type: proxy
- id: i-067c5d985c194e036
type: db
- id: i-0679e87f06d0cf9a2
type: db


Which I'd like to turn into this structure:


instances:
web:
- id: i-0fe48c061f6a323a0
- id: i-0403e39813defda31
proxy:
- id: i-0442f13b528e5e1c6
- id: i-0ebea75d008becaa6
db:
- id: i-067c5d985c194e036
- id: i-0679e87f06d0cf9a2


But I can't figure out how to do this...





--
Dick Visser
Trust & Identity Service Operations Manager
GÉANT

Kai Stian Olstad

unread,
Nov 22, 2019, 1:16:09 PM11/22/19
to ansible...@googlegroups.com
Are you sure you need the id in the list as it's redundant and without
it is very simple with selectattr and map.

--
Kai Stian Olstad

Vladimir Botka

unread,
Nov 22, 2019, 2:12:31 PM11/22/19
to Dick Visser, ansible...@googlegroups.com
The task below does the job

- set_fact:
instances2: "{{ instances2|
default({})|
combine({item.0: item.1|
json_query('[].{id: id}')}) }}"
loop: "{{ instances|groupby('type') }}"

Cheers,

-vlado

Srinivasa Jasti

unread,
Nov 22, 2019, 6:10:24 PM11/22/19
to ansible...@googlegroups.com, Dick Visser
Here is another way.  Although I like vladimir Botka's solution.

---

- hosts: localhost

  gather_facts: no

  

  vars:

    instances:

      - id: 1234

        type: web

      - id: 1456

        type: web

      - id: 1678

        type: web

      - id: 3456

        type: proxy

      - id: 2567

        type: proxy

      - id: 2566

        type: db

      - id: 4900

        type: db


  tasks:

  - name: Set Fact for proxy

    set_fact:

      new_proxy: "{{ new_proxy|default([]) + [ { 'id': item.id } ] }}"

    loop: "{{ instances }}"

    when: item.type == 'proxy'


  - name: set Fact for db

    set_fact:

      new_db: "{{ new_proxy|default([]) + [ {'id': item.id } ] }}"

    loop: "{{ instances }}"

    when: item.type == 'db'


  - name: set Fact for web 

    set_fact:

      new_web: "{{ new_proxy|default([]) + [ {'id': item.id } ] }}"

    loop: "{{ instances }}"

    when: item.type == 'web'


  - name: Print facts

    debug:

      msg: "Web - {{ new_web }} - DB - {{ new_db }} - Proxy - {{ new_proxy }}"

    

  - name: Final set fact

    set_fact:

      new_instances: "{{ new_instances|default([]) + [ {'db': new_db}, {'web': new_web}, {'proxy': new_proxy} ] }}"


  - name: Print final fact

    debug:

      var: new_instances


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/20191122201219.5d637e3c%40gmail.com.
Reply all
Reply to author
Forward
0 new messages