Looping through a group's IP numbers

108 views
Skip to first unread message

Michael Mahemoff

unread,
Mar 4, 2014, 4:09:32 PM3/4/14
to ansible...@googlegroups.com
I have a rule like this:

- name: Create user
  mysql_user: name=app
                     host=={{ item }}
                     ...
  with_items:
    - localhost
    - 127.0.0.1
    - "{{ groups['webservers'] }}"
    # - <here I want to list ip numbers of the webservers group>

How can I make the list include IP numbers of each webserver host. I know I can use ansible_eth0.ipv4.address to map from hostname to IP, but I don't know how to map a whole list to another list. And I can't see any way to define a variable as the result of a loop.

Matt Martz

unread,
Mar 4, 2014, 4:16:15 PM3/4/14
to Michael Mahemoff, ansible...@googlegroups.com
I would split your create user into 2 tasks.  1 for localhost and the other for web servers:

- name: Create localhost mysql users
  mysql_user: name=app host="{{ item }}"
  with_items:
    - localhost
    - 127.0.0.1

- name: Create webservers mysql users
  mysql_user: name=app host="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
  with_items: groups['webservers']

-- 
Matt Martz
ma...@sivel.net
--
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/9821a9c0-b62b-4e50-bfe7-10559124ebb6%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Michael Mahemoff

unread,
Mar 5, 2014, 6:27:37 AM3/5/14
to ansible...@googlegroups.com, Michael Mahemoff
I see, thanks. I'd still be interested if there's any other way to do it, as it would be useful elsewhere too and prefer not to duplicate plays if possible.

Matt Martz

unread,
Mar 5, 2014, 8:22:26 AM3/5/14
to Michael Mahemoff, ansible...@googlegroups.com, Michael Mahemoff
The other way to do it would be something like:

- name: Create mysql servers
  mysql_user: name=app host="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] if hostvars[item]['ansible_eth0'] is defined else item }}"
  with_items:
    - localhost
    - 127.0.0.1
    - "{{ groups['webservers'] }}

The above example should work with 1.5, although I do believe that is over complicated, hard to read and not easily understand.  

You could expand that to a regular {% if ... %}{{ address }}{% else %}{{ item }}{% endif %} type line, but that gets even longer and harder to read in my opinion with all of the special characters that get mixed into that line.

-- 
Matt Martz
ma...@sivel.net
Reply all
Reply to author
Forward
0 new messages