Ansible – Convert String to Dictionary

ansible

I'm launching Ansible from Tower, then I'm filling the new users as a text:

{ name: user1, uid: 5000 }
{ name: user2, uid: 5001 }

I would like to iterate those users as a dictionary, something as:

- name: Print vars
  debug:
    var: "{{ item.name }}"
  with_items: "{{ users.split('\n') }}"

But it doesn't work:

TASK [Print vars] *********************************************************************************************************************
ok: [lx-test] => (item={ name: user1, uid: 5000 }) => {
    "ansible_loop_var": "item",
    "item": "{ name: user1, uid: 5000 }",
    "{ name: user1, uid: 5000 }": "VARIABLE IS NOT DEFINED!"
}
ok: [lx-test] => (item={ name: user2, uid: 5001 }) => {
    "ansible_loop_var": "item",
    "item": "{ name: user2, uid: 5001 }",
    "{ name: user2, uid: 5001 }": "VARIABLE IS NOT DEFINED!"
}

Any idea how to convert that string to a real dictionary? Thanks in advance!

Best Answer

Update

The expression below

users_list: "{{ users_str.splitlines()|map('from_yaml')|list }}"

gives

users_list:
  - name: user1
    uid: 5000
  - name: user2
    uid: 5001

Declare the variable as appropriate.


Original answer

The text is neither valid JSON nor YAML. You'll have to split the lines and read the dictionaries line by line. For example, given the text

users_str: |
  { name: user1, uid: 5000 }
  { name: user2, uid: 5001 }

the task below

    - set_fact:
        users_list: "{{ users_list|d([]) + [item|from_yaml] }}"
      loop: "{{ users_str.splitlines() }}"

creates the list of dictionaries

users_list:
  - name: user1
    uid: 5000
  - name: user2
    uid: 5001

The iteration is trivial now

    - debug:
        var: item.name
      loop: "{{ users_list }}"

gives

  item.name: user1
  item.name: user2