for loop in jinja2

24 views
Skip to first unread message

David Fazeli

unread,
Feb 23, 2018, 7:28:32 AM2/23/18
to Ansible Project
Please explain to me how can I fix this problem? i have this file defaults/main.yml

---
node1
:
 ip
: 1.1.1.1

node2
:
 ip
: 2.2.2.2

node3
:
 ip
: 3.3.3.3

Now, I want in template file ip.j2 by for loop access the IPs of each server and save in address variable

Like this:


address= 1.1.1.1,2.2.2.2,3.3.3.3



I tried this code:


address={% for x in {{nubmer_nodes}} %}
{{node[x].ip}}
{% if loop.last %},{% endif %}
{% endfor %}



But an error occurs. How should I do this?


Error :


TASK [Gathering Facts] *********************************************************************

ok
: [db2]
ok
: [db3]
ok
: [db1]

TASK
[ssh : -- my loop --] *************************************************************************

fatal
: [db1]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
fatal
: [db2]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
fatal
: [db3]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
        to
retry, use: --limit @/etc/ansible/playbooks/get_ip_ssh.retry

PLAY RECAP
********************************************************

db1                        
: ok=1    changed=0    unreachable=0    failed=1
db2                        
: ok=1    changed=0    unreachable=0    failed=1
db3                        
: ok=1    changed=0    unreachable=0    failed=1










Kai Stian Olstad

unread,
Feb 23, 2018, 8:59:48 AM2/23/18
to ansible...@googlegroups.com
On Friday, 23 February 2018 13.28.32 CET David Fazeli wrote:
> Please explain to me how can I fix this problem? i have this file
> defaults/main.yml
>
> ---
> node1:
> ip: 1.1.1.1
>
> node2:
> ip: 2.2.2.2
>
> node3:
> ip: 3.3.3.3
>
>
> Now, I want in template file ip.j2 by for loop access the IPs of each
> server and save in address variable
>
> Like this:
>
> address= 1.1.1.1,2.2.2.2,3.3.3.3
>
>
> I tried this code:
>
> address={% for x in {{nubmer_nodes}} %}

You are already in template mode so you can't use {{ }}
address={% for x in nubmer_nodes %}

You have not shown your nubmer_nodes, but to make it work it need to be [1, 2, 3] for it to work.


> {{node[x].ip}}

This try to look up a likt named node, you need
{{ vars['node' ~ x }}


> {% if loop.last %},{% endif %}

This will only print , at the end, you are missing a not.
And to suppress the newline in the previous line you also need a - added

{%- if not loop.last %},{% endif %}


--
Kai Stian Olstad

Nigel Metheringham

unread,
Feb 23, 2018, 9:55:31 AM2/23/18
to ansible...@googlegroups.com
Personally I would have done this like this (but you may have reasons for arranging it differently)...

defaults/main.yml:-
---
nodes:
    - name: node1
      ip: 1.1.1.1
    - name: node2
      ip: 2.2.2.2
    - name: node3
      ip: 3.3.3.3

Then the template something like

address={% for node in nodes %}
{{ node.ip}}
{% if not loop.last %},{% endif %}
{% endfor %}

All untested (sorry!)

    Nigel.
23 February 2018 at 12:28
--
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 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/17069ac9-16f3-40f4-ae59-dbeaadc10133%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
[ Nigel Metheringham ------------------------------ ni...@dotdot.it ] 
[                 Ellipsis Intangible Technologies                  ]
 

Reply all
Reply to author
Forward
0 new messages