Ansible create a dictionary from list where odds are keys evens are values

Viewed 56

I have data in YAML format below

ospf_neighbors:
  - data: xe-0/0/1.0
  - data: Full
  - data: xe-0/0/10.0
  - data: Full
  - data: xe-0/0/11.0
  - data: Full

What I want to do is create a dictionary with basically the odds been keys and the evens been values. This is the target:

ospf_neighbors_dict:
  xe-0/0/1.0: Full
  xe-0/0/10.0: Full
  xe-0/0/11.0: Full
- name: Create Dict Pair for OSPF neighbors
  set_fact:
     ospfneighbors_dict: "{{ ospfneighbors_dict|
                             default({})|
                             combine({item['data'][::2]: item['data'][1::2]}) }}"
  with_items: "{{ ospf_neighbors }}"

But that is just splicing the data, e.g "Fl": "ul"

2 Answers

For example

    - set_fact:
        ospf_neighbors_dict: "{{ dict(_keys|zip(_vals)) }}"
      vars:
        _data: "{{ ospf_neighbors|map(attribute='data')|list }}"
        _keys: "{{ _data[::2] }}"
        _vals: "{{ _data[1::2] }}"

creates the target

ospf_neighbors_dict:
  xe-0/0/1.0: Full
  xe-0/0/10.0: Full
  xe-0/0/11.0: Full

A lot of solutions, one:

    - set_fact:
        ospf_neighbors_dict: "{{ ospf_neighbors_dict|d({})|
                                 combine({ospf_neighbors[item].data:
                                          ospf_neighbors[item + 1].data}) }}"
      loop: "{{ range(0, ospf_neighbors|length, 2) }}"

Result:

ospf_neighbors_dict:
  xe-0/0/1.0: Full
  xe-0/0/10.0: Full
  xe-0/0/11.0: Full
Related