Collecting a list of internal IPs from EC2

Another newbie questions (second and last for today, I promise)
I have two groups for EC2 instances:

  • Test servers
  • Loader servers
    each with a different tag.
    I would like to get the list of the internal_ip of the Test group, and use it to run a command on the Loaders group.
    Any pointer will be appreciated!

Thanks

The following AWS CLI command will give you a list of all internal IPs (which you could run only against the Test host group):

aws ec2 describe-instances --query 'Reservations[*].Instances[*].PrivateIpAddress' --output text

Thanks Alex
This works, but my end goal is to use the list in a playbook.

A similar example I’m struggling with:
Terminate all EC2 instances with a specific name.
I come up with the following:

`

Hi Tzach

I usually approach instance termination by matching the instances with ec2 dynamic inventory, then add them to a group and terminate them in another play targeted at the newly created group, based on their instance id (which is automatically added as an inventory variable by the ec2 inventory script).

Note that I specify gather_facts: false and do not reference the hostvars dictionary. That way, Ansible does not attempt or need to reach the instances via ssh before it is able to terminate them.

- name: Find sandbox instance(s) with matching name
  hosts: tag_Name_Test
  gather_facts: false
  tasks:

    - name: Create group
      group_by: key=legacy

- hosts: legacy
  connection: local
  gather_facts: false
  tasks:

    - name: Terminate instance(s)
      ec2:
        instance_ids: "{{ ec2_id }}"
        state: absent

Hope this helps.

Tom

Thanks Tom!
It works, but I do not understand how or why :slight_smile:

Hi Tzach

I usually approach instance termination by matching the instances with ec2 dynamic inventory, then add them to a group and terminate them in another play targeted at the newly created group, based on their instance id (which is automatically added as an inventory variable by the ec2 inventory script).

Note that I specify gather_facts: false and do not reference the hostvars dictionary. That way, Ansible does not attempt or need to reach the instances via ssh before it is able to terminate them.

- name: Find sandbox instance(s) with matching name
  hosts: tag_Name_Test
  gather_facts: false
  tasks:

    - name: Create group
      group_by: key=legacy

This create a host group called Legacy


- hosts: legacy

This use the legacy group, so why cant I use the tag_Name_Test directly?


  connection: local

Why this play have connection: local and first does not?


  gather_facts: false
  tasks:

    - name: Terminate instance(s)
      ec2:
        instance_ids: "{{ ec2_id }}"

region: {{ region }} is also required


        state: absent

Hope this helps.

And last: can I use two different tag name, and merge them somehow?