Dynamic string/list manipulation

I’m not even sure how to name this thread, but hopefully from the example you will understand what I mean.

I was reading this article https://medium.com/@jmarhee/deploying-a-glusterfs-storage-cluster-with-ansible-on-digitalocean-14dacd721e23 and in the middle of the article below the “Creating the cluster” title there is a playbook with 3 plays, one for each host in the cluster, where in each play the current host IP address is excluded. The reason why I hate this solution, is because if tomorrow you would like to add one more node to the cluster, besides adding the new node to the appropriate group, you would need to edit every task of that playbook and add a new play for the new node, which is anything but simple.

On IRC in the ansible channel halberom gave a nice solution to this problem https://gist.github.com/halberom/72b70a8cba934b9d58b9, but it feels sort of like a hack and that it should be easier to accomplish something like this in Ansible.

Is there an easier solution (e.g. using with_items/when), and if not maybe there should be?

you could

set_fact: mypeers={{ groups['gluster']|difference([inventory_hostname])}}

I knew about that part, but from there how do you extract IP addresses from that list of hosts and put them in a string concatenated by a comma?

something like:

with _items: otherservers
set_fact:
   otherips: "{{otherips}}, " + hostvars[item]['ansible_' +
rhel7_interface in hostvars[host]|ternary(['an['ansible_' +
rhel7_interface, 'ansible_' + default_interface) ....

or I would try using the jinja2 map filter. its going to be ugly in any case.

That doesn’t work for me. Here is a simple playbook for testing:

`