>
> Meanwhile, this looks problematic:

  template: src=pg_ident.conf.j2 
> dest=/etc/postgresql/9.3/main/pg_ident.conf owner=postgres group=postgres 
> mode=0640

Why?
> You're evaluating it multiple times in a loop, but there is no variable in 
> the destination path. The result is you've re-templated the file many times.
> I think you don't need the loop, and just need to simply reference 
> postgres_users as a variable in the template, and templating the file once 
> is fine.


I was originally under the impression that you needed to pass lists/dicts 
to templates explicitly (i.e. for use by Jinja) - hadn't realised that they 
were global.

You've solved my confusion though (and dropped in a BSG reference to boot!) 
— thanks Michael.


On Saturday, August 16, 2014 11:14:44 PM UTC+8, Michael DeHaan wrote:
>
> With dict works a little differently than with_items.
>
> with_items will return one item in the postgres_users list, one after 
> another, if it were a list of users.
>
> postgres_users:
>    - name: boxey
>      db: cargo_ship
>
> Now, when using with_dict, it works differently, returning keys as 
> item.key and values as item.value
>
> http://docs.ansible.com/playbooks_loops.html#looping-over-hashes
>
> I'd consider either passing a list as above or using with_dict, but noting 
> what it returns.
>
> Meanwhile, this looks problematic:
>
>   template: src=pg_ident.conf.j2 
> dest=/etc/postgresql/9.3/main/pg_ident.conf owner=postgres group=postgres 
> mode=0640
>
> Why?
>
> You're evaluating it multiple times in a loop, but there is no variable in 
> the destination path. The result is you've re-templated the file many times.
>
> I think you don't need the loop, and just need to simply reference 
> postgres_users as a variable in the template, and templating the file once 
> is fine.
>
> But you can't use a simple for loop, because postgres_users is not a list.
>
> Try:
>
> {% for (key, value) in postgres_users.iteritems() %}
>
> {% endfor %}
>
> if you want to keep things as a hash/dictionary.
>
>
>
> On Sat, Aug 16, 2014 at 7:38 AM, Matt Silverlock <[email protected] 
> <javascript:>> wrote:
>
>> Hi all,
>>
>> Trying to pull together my understanding of Jinja's looping constructs, 
>> Ansible's with_dict and from what I've seen out in the wild (i.e. on 
>> GitHub). I've taken a look around at some other examples but can't seem to 
>> adapt them to my approach (i.e. 
>> https://github.com/timmahoney/ansible-redhat-extra-repos/blob/master/defaults/main.yml
>>  
>> is close to what I'm after)
>>
>> At the moment I'm attempting to loop over a YAML dict of OS user <-> DB 
>> user mappings (for pg_ident.conf) and am running into an error:
>>
>> *# host_vars/<hostname>*
>> postgres_users:
>>   baltar:
>>     os: "{{ username }}"
>>     db: "{{ db_name }}"
>>   caprica:
>>     os: "{{ username }}"
>>     db: "{{ db_name }}"
>>  
>> *# pg_ident.conf.j2*
>>  
>> {% for user in postgres_users %}
>> {{ user.db }}   {{ user.os }}           {{ user.key }}
>> {% endfor %}
>>  
>> *# roles/postgresql/tasks/postgres.yml*
>>  
>> - name: copy postgres ident maps
>>   template: src=pg_ident.conf.j2 
>> dest=/etc/postgresql/9.3/main/pg_ident.conf owner=postgres group=postgres 
>> mode=0640
>>   register: postgres_ident
>>   with_dict: postgres_users
>>  
>> *# error message*
>>  
>> TASK: [postgres | copy postgres ident maps] 
>> ***********************************
>> fatal: [default] => {'msg': "AnsibleUndefinedVariable: One or more 
>> undefined variables: 'str object' has no attribute 'db'", 'failed': True}
>> fatal: [default] => {'msg': 'One or more items failed.', 'failed': True, 
>> 'changed': False, 'results': [{'msg': "AnsibleUndefinedVariable: One or 
>> more undefined variables: 'str object' has no attribute 'db'", 'failed': 
>> True}]}
>>
>> -----
>>
>> I've also attempted the below:
>>
>>
>> *# host_vars/<hostname>*
>> # same as before
>>
>> *# template*
>> {% for k, v in item %}
>> {{ v.db }}   {{ v.os }}           {{ k }}
>> {% endfor %}
>>
>> *# task*
>> # same as before
>>
>> This fails with "too many values to unpack".
>>
>> Which is the functional and favored approach? I'd rather the map keys be 
>> the names but can't seem to get this to work.
>>
>>
>>
>>  -- 
>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/ansible-project/a1f23c94-398a-4043-96ed-3a88feb7e03c%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/ansible-project/a1f23c94-398a-4043-96ed-3a88feb7e03c%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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/37231d1a-139f-46ab-96f6-685837132385%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to