Access dict key when using with_subelements

515 views
Skip to first unread message

Peter Thorson

unread,
Apr 6, 2016, 6:47:01 PM4/6/16
to Ansible Project
when using with_dict, item.key retrieves the dict key and item.value retrieves the value.

however, when using with_subelements and having the first item being looped over be a dict, item.0 seems to return only the value. Is there a way

concrete example:

vars:
  users
:
    bob
:
      authorized_keys
:
       
- "ssh-rsa a..."
       
- "ssh-rsa b..."
    alice
:
      authorized_keys
:
       
- "ssh-rsa c..."


tasks
:
 
- authorized_key: user=??? key="{{ item.1 }}"
    with_subelements
:
     
- "{{ users }}"
     
- authorized_keys

How do I retrieve the username? I understand that I could change users into a list and add username as a property. I want to avoid that because this users list is used for lots of different things where being able to look up information about a user by username is required.

Slavek Jurkowski

unread,
Oct 13, 2016, 11:10:32 AM10/13/16
to Ansible Project
Hi Peter,

Did you find a solution to this? I'm facing the same issue and it sure sucks!

Thanks

Peter Thorson

unread,
Oct 13, 2016, 12:24:08 PM10/13/16
to Ansible Project
I have been using a horrible hacky workaround, specifically, adding the key as a field to the dict element:

vars:
  users
:
    bob
:
      name: bob
      authorized_keys
:

       
- "ssh-rsa a..."
       
- "ssh-rsa b..."
    alice
:
      name: alice
      authorized_keys
:
       
- "ssh-rsa c..."


tasks
:
 
- authorized_key: user=item.0.name key="{{ item.1 }}"

    with_subelements
:
     
- "{{ users }}"
     
- authorized_keys

This is difficult to maintain because the two names can get out of sync, it is not intuitive at all that making a new user should include the name again when its already used as the key. It is just the least worst solution I've found.

I wish there was a sane, unified, flexible solution to looping in Ansible. As it stands there appear to be a bunch of one-off non-interoperable looping constructs designed for very narrow purposes. This is easily the most frustrating aspect of using Ansible for anything non-trivial.

Slavek Jurkowski

unread,
Oct 13, 2016, 2:18:25 PM10/13/16
to ansible...@googlegroups.com
Thanks for the reply. i agree..I just converted my dict in the same way..Just wanted to check if there was something better out there that anyone has found :P

Slavek


-- 
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/6J6Yg--7CvA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/51dfa4f3-d582-4043-945b-0eb094495ec0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

General Luken

unread,
Nov 28, 2016, 7:05:57 PM11/28/16
to Ansible Project
I have workaround for this. You basically have to use "include" as a function. Let's say your {{users}} structure looks like this:

users:
  ssh_keys
:
 
- somekeyfdsfdsfdsfsdfsdyttytry
 
- someotherkeyfdsryekfdlmgdfm

In your main.yml there would be:

- include: ssh_key.yml
           _users_ssh_keys
={{item.value.ssh_keys}}
           _users_username
={{item.key}}
  with_dict
: "{{users}}"

And in ssh_key.yml you would iterate over all ssh keys like this:

---
- name: SSH key is installed
  authorized_key
: user="{{_users_username}}" key="{{_ssh_key_item}}"
  loop_control
:
    loop_var
: _ssh_key_item
  with_items
: "{{_users_ssh_keys}}"

I hope it will help someone.
Reply all
Reply to author
Forward
0 new messages