Looping over a set of host in a playbook?

2,095 views
Skip to first unread message

Sébastien Han

unread,
Apr 14, 2014, 11:59:15 AM4/14/14
to ansible...@googlegroups.com
Hello,

I'm trying to loop over a set of host, get their IP and then append the result to a file.

Currently the action looks like this:

- name: build rings
  command: swift-ring-builder {{ item.service }}.builder add z1-{{ hostvars[inventory_hostname]["ansible_bond1.2108"].ipv4.address }}:{{ item.port }}/sdb1 100
           chdir=/etc/swift
  with_items:
    - { service: 'account', port: '6002' }
    - { service: 'container', port: '6001' }
    - { service: 'object', port: '6000' }
    - groups.storages

Basically I'd like to look over 'groups.storages' in {{ hostvars[inventory_hostname]["ansible_bond1.2108"].ipv4.address }.

Is it doable?

This looks like this https://coderwall.com/p/w5o6eq, althought it doesn't seem to work with the new convention "{{ }}"

Thanks in advance :).

Cheers!

Sébastien Han

unread,
Apr 16, 2014, 4:42:49 AM4/16/14
to ansible...@googlegroups.com
Up?

Michael DeHaan

unread,
Apr 16, 2014, 10:21:33 PM4/16/14
to ansible...@googlegroups.com
Seems like you *might* mean with_nested seeing you are looping over what appears to be two different lists.

Or else "groups.storages" is something else.  That looks like the odd one out to me.

Everything else looks fine, so when you say "doesn't seem to work", more info would be helpful about how it was not working?

Thanks!


--
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/b1d69cd7-8326-4840-a7ae-6e66a528fde4%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Sébastien Han

unread,
Apr 17, 2014, 4:16:09 AM4/17/14
to ansible...@googlegroups.com
Hello Michael,

Thanks for your response.

What I'm trying to achieve is exactly what is described in this post: https://coderwall.com/p/w5o6eq

As an example, I tried the following:

- name: iterate over hosts
  command: echo {{ hostvars.{{ item }}.ansible_hostname }}
  with_items:
    - groups.storages
  ignore_errors: true
  tags: gz


As far as I understand this is supposed to return every hostname, instead I get:

changed: [ceph001.enocloud.com] => (item=groups.storages) => {"changed": true, "cmd": ["echo", "{{hostvars.{{item}}.ansible_hostname}}"], "delta": "0:00:00.003401", "end": "2014-04-17 10:11:03.764429", "item": "groups.storages", "rc": 0, "start": "2014-04-17 10:11:03.761028", "stderr": "", "stdout": "{{hostvars.{{item}}.ansible_hostname}}"}

Any idea? Furthermore, the final goal is to collect the ip address of the following intertace: ansible_bond1.2108. Not sure if it's reachable given this: https://github.com/ansible/ansible/issues/6879

Thanks for your help.

--
Regards,
Sébastien Han.


--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/vOjMC-FkqAI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.

Michael DeHaan

unread,
Apr 17, 2014, 7:52:00 AM4/17/14
to ansible...@googlegroups.com
Got it!  This is the problem line:

  command: echo {{ hostvars.{{ item }}.ansible_hostname }}

It should look like this:

{{ hostvars[item].ansible_hostname }}

Basically templates don't nest, and inside of template expressions, you can just use variables mostly as if they were Python.

Hope that helps!



Sébastien Han

unread,
Apr 17, 2014, 12:05:32 PM4/17/14
to ansible...@googlegroups.com
Thanks! This is getting better and better:

Modifying my playbook like this:

- name: iterate over hosts
  command: ping -c 1 {{ hostvars[item]["ansible_bond1.2108"].ipv4.address }}
  with_items: groups.storages
  ignore_errors: true
  tags: gz


Now I get:

< TASK: swift-proxy | iterate over hosts >

 ----------------------------------------

        \   ^__^

         \  (oo)\_______

            (__)\       )\/\

                ||----w |

                ||     ||



failed: [ceph0010] => (item=ceph0020) => {"changed": true, "cmd": ["ping", "-c", "1", "{{hostvars[item][ansible_bond1.2108].ipv4.address}}"], "delta": "0:00:00.005304", "end": "2014-04-17 17:59:50.851952", "item": "ceph0020", "rc": 1, "start": "2014-04-17 17:59:50.846648"}

stderr: ping: unknown host

...ignoring

failed: [ceph0010] => (item=ceph0030) => {"changed": true, "cmd": ["ping", "-c", "1", "{{hostvars[item][ansible_bond1.2108].ipv4.address}}"], "delta": "0:00:00.005213", "end": "2014-04-17 17:59:51.026424", "item": "ceph0030", "rc": 1, "start": "2014-04-17 17:59:51.021211"}

stderr: ping: unknown host

...ignoring

failed: [ceph0010] => (item=ceph0040) => {"changed": true, "cmd": ["ping", "-c", "1", "{{hostvars[item][ansible_bond1.2108].ipv4.address}}"], "delta": "0:00:00.005305", "end": "2014-04-17 17:59:51.200587", "item": "ceph0040", "rc": 1, "start": "2014-04-17 17:59:51.195282"}

stderr: ping: unknown host

...ignoring

failed: [ceph0010] => (item=ceph0050) => {"changed": true, "cmd": ["ping", "-c", "1", "{{hostvars[item][ansible_bond1.2108].ipv4.address}}"], "delta": "0:00:00.005345", "end": "2014-04-17 17:59:51.374977", "item": "ceph0050", "rc": 1, "start": "2014-04-17 17:59:51.369632"}

stderr: ping: unknown host

...ignoring

failed: [ceph0010] => (item=ceph0060) => {"changed": true, "cmd": ["ping", "-c", "1", "{{hostvars[item][ansible_bond1.2108].ipv4.address}}"], "delta": "0:00:00.005203", "end": "2014-04-17 17:59:51.548855", "item": "ceph0060", "rc": 1, "start": "2014-04-17 17:59:51.543652"}

stderr: ping: unknown host

...ignoring

Any idea?

Thanks again in advance :)

Michael DeHaan

unread,
Apr 17, 2014, 6:13:47 PM4/17/14
to ansible...@googlegroups.com
"ansible_bond1.2108"

This part needs quotes around it.




Sébastien Han

unread,
Apr 18, 2014, 4:12:31 AM4/18/14
to ansible...@googlegroups.com
I'm confused, quotes are already there.

command: ping -c 1 {{ hostvars[item]["ansible_bond1.2108"].ipv4.address }}


--
Regards,
Sébastien Han.


Sébastien Han

unread,
Apr 22, 2014, 5:02:53 PM4/22/14
to ansible...@googlegroups.com
No more ideas?

--
Regards,
Sébastien Han.


To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscribe@googlegroups.com.

To post to this group, send email to ansible-project@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/vOjMC-FkqAI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.

Strahinja Kustudić

unread,
Apr 22, 2014, 6:13:26 PM4/22/14
to ansible...@googlegroups.com
Try:

{{ hostvars[item]['ansible_bond1.2108']['ipv4']['address'] }}

No more ideas?

--
Regards,
Sébastien Han.


--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/vOjMC-FkqAI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.

Sébastien Han

unread,
Apr 23, 2014, 4:17:48 AM4/23/14
to ansible...@googlegroups.com
Same error :(

Strahinja Kustudić

unread,
Apr 23, 2014, 4:29:30 AM4/23/14
to ansible...@googlegroups.com
Could you try instead of command module something like:

debug: msg="{{ hostvars[item]['ansible_bond1.2108']['ipv4']['address'] }}"

And run ansible-playbook with -vvvv.

Sébastien Han

unread,
Apr 23, 2014, 4:42:40 AM4/23/14
to ansible...@googlegroups.com
Thanks for you help, this is what I got:


Cheers.

--
Regards,
Sébastien Han.


Strahinja Kustudić

unread,
Apr 23, 2014, 5:00:56 AM4/23/14
to ansible...@googlegroups.com
You didn't understand me, I would like you to replaced the whole "command: ping -c 1 {{ hostvars[item]["ansible_bond1.2108"].ipv4.address }}" line with the debug line I wrote in my previous reply.

Sébastien Han

unread,
Apr 23, 2014, 5:21:20 AM4/23/14
to ansible...@googlegroups.com
Arf sorry, I read too fast.


--
Regards,
Sébastien Han.


Strahinja Kustudić

unread,
Apr 23, 2014, 5:40:47 AM4/23/14
to ansible...@googlegroups.com
I don't understand, it's like it is not recognizing the hostvars keyword?

Sébastien Han

unread,
Apr 23, 2014, 9:34:47 AM4/23/14
to ansible...@googlegroups.com
I don't know :/

--
Regards,
Sébastien Han.


Sébastien Han

unread,
Apr 25, 2014, 10:07:47 AM4/25/14
to ansible...@googlegroups.com
No one?

--
Regards,
Sébastien Han.


To unsubscribe from this group and all its topics, send an email to ansible-project+unsubscribe@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.

Stefan Mojsilovic

unread,
Oct 1, 2014, 11:04:20 AM10/1/14
to ansible...@googlegroups.com
Had the same problem. Managed to solve it using this way to access the value:

debug: msg="{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
with_items: groups.web_servers

--
Regards,
Sébastien Han.


To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages