EC2: collect list of private-ip from on group, use it in a second group

Posted a similar question a few days ago, got the right answer.
Now I can better explain what I’m looking for.

I’m building a EC2 system from two types of servers:

  • cluster nodes
  • loader nodes
    Each loader is generating traffic to ALL cluster nodes.

My goal is a playbook which collect private-ip from each the first group, and use it as part of a command to be executed on the second group.
I assume it should look something like:

`

Here’s a quick sample playbook that should do what you are trying to do. Keep in mind that the ec2.py dynamic inventory script will gather the private IPs for you, you shouldn’t need an explicit task.

`

  • hosts: localhost
    tasks:

  • debug: msg=“{{ hostvars[item].ec2_private_ip_address }}”
    with_items: groups.tag_Name_ClusterNodes
    register: output

  • debug: msg=“{{ output.results|map(attribute=‘msg’)|join(’ ') }}”

`

You could also write a custom jinja2 filter to make this a single task.

  • James

Thanks James
Works like a charm. register is what I was looking for.

What should I use in production instead of the first debug?
I need the data, not the output to the screen.

Sorry, I’m not sure of a way to suppress that, outside of using a custom filter.

  • James

look at set_fact

Sorry, was a bit confused by your comment “What should I use in production instead of the first debug?”

If you mean, not to use “debug” in your first task because it’s too verbose, you don’t have to. But using it is not going to harm anything even on production. If you want to do it in a less verbose way:

`

  • hosts: localhost
    tasks:

  • command: echo “{{ hostvars[item].ec2_private_ip_address }}”
    with_items: groups.tag_Name_ClusterNodes
    register: output
    changed_when: no

  • debug: msg=“{{ output.results|map(attribute=‘stdout’)| join(’ ') }}”

`

as far as the second debug goes, you could, as bcoca pointed out, use set_fact:

`

  • set_fact: ip_list=“”{{ output.results|map(attribute=‘stdout’)| join(’ ') }}"
    `

And subsequent tasks could then reference the list as “{{ ip_list }}”

  • James

Thanks James, Brain
This is precisely what I was looking for!