tl;dr: is there a way to make with_subelements work with dicts? Or 
something to that effect?


I've been trying to figure out how to run a task over a dict, that also 
loops over a nested dict in order to run the actual commands.

So far, I haven't figured out how to use with_items, with_dict, or 
with_nested to do what I want. with_subelements comes close, but keeps 
choking on the fact my subelement is not a list.

My playbook (would have pastebined it, but pastebin wouldn't load for 
me...):

---
> # testing playbook
> - hosts: 192.168.88.2
>   vars:
>     people:
>       johnsmith:
>         fname: john
>         lname: smith
>         locations:
>           birthplace:
>             state: id
>             city: boise
>           second:
>             state: or
>             city: portland
>           third:
>             state: ha
>             city: honolulu
>       jilljones:
>         fname: jill
>         lname: jones
>         locations:
>           birthplace:
>             state: mo
>             city: springfield
>           second:
>             state: mt
>             city: fort benton
>           third:
>             state: id
>             city: emmett
>       jilljones:
>         locations:
>           birthplace:
>             state: wa
>             city: wilbur
>   tasks:
>     - name: testing dict
>       debug: msg="{{ item.1 }}"
>       with_subelements:
>         - people
>         - locations



The output:

>
> $ ansible-playbook -i hosts -u vagrant --sudo tmp/testing.yml
> PLAY [192.168.88.2] 
> *********************************************************** 
> GATHERING FACTS 
> *************************************************************** 
> ok: [192.168.88.2]
> TASK: [testing dict] 
> ********************************************************** 
> fatal: [192.168.88.2] => the key locations should point to a list, got 
> '{'birthplace': {'city': 'boise', 'state': 'id'}, 'second': {'city': 
> 'portland', 'state': 'or'}, 'third': {'city': 'honolulu', 'state': 'ha'}}'
> FATAL: all hosts have already failed -- aborting
> PLAY RECAP 
> ******************************************************************** 
>            to retry, use: --limit @/home/reagand/testing.retry
> 192.168.88.2               : ok=1    changed=0    unreachable=1   
>  failed=0   


What I want to see is something like:

johnsmith:
>           birthplace:
>             state: id
>             city: boise
>           second:
>             state: or
>             city: portland
>           third:
>             state: ha
>             city: honolulu
> jilljones:
>           birthplace:
>             state: wa
>             city: wilbur
>           second:
>             state: mt
>             city: fort benton
>           third:
>             state: id
>             city: emmett



I really need this to be a dict/hash so that hash_behaviour=merge works. 
For example, if I want jilljones birthplace to default to springfield, mo, 
in group_vars, but for a specific host it should be seattle, wa, then I 
would set the following in the specific host_vars file:

people:
>   jilljones:
>     locations:
>       birthplace:
>          city: seattle
>          state: wa



Note, I've only been using this people hash as something to experiment on. 
My actual use case is a task that sets configuration settings for a web 
app. The app config didn't lend itself to templating. I tried that first. 
Now I've ended up with lininfile regex replacements, each named with their 
own key. Something like:

configkey:
>   regex:
>   value:
> configkey2:
>   regex:
>   value:
> ... 

That's the equivalent of the locations hash in my testing playbook.

I also don't know how many instances of the app I'll have per server, so I 
can't just do a task per instance. 

Ultimately, if I make my subelement a list, http://pastebin.com/mixMTz6H 
(pastebin worked earlier...) it works, but it overrides all the previously 
set subelements of the main key. That means I have to copy all the 
locations from group_vars into host_vars if I want to override something on 
a specific host. I'd prefer to avoid that. So, is there a with_subelements 
that would work with a hash like I want? Or another way to get the same 
effect?
 

-- 
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/3bf69804-8242-455f-a97d-7605e6336cf8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to