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]> 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].
> 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/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/CA%2BnsWgzWzm7Sbrs12XScGgYxYkf1tATDnvXABiXBu_4CDfJoYQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to