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.
Hi Peter,
Did you find a solution to this? I’m facing the same issue and it sure sucks!
Thanks
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.
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
Slavek
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:
`