Collecting a list of internal IPs from EC2

143 views
Skip to first unread message

Tzach Livyatan

unread,
Jan 14, 2015, 4:47:21 AM1/14/15
to ansible...@googlegroups.com
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

Alex Clifford

unread,
Jan 14, 2015, 8:26:32 AM1/14/15
to ansible...@googlegroups.com
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

Tzach Livyatan

unread,
Jan 15, 2015, 8:22:11 AM1/15/15
to ansible...@googlegroups.com
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:
---
- name: Terminate EC2 instances with name Test
  hosts: 127.0.0.1
  connection: local
  vars:
  tasks:
    - action: ec2_facts
    - debug: msg="{{ hostvars[item]['ec2_id'] }}"
      with_items: 
        groups['tag_Name_Cassandra']
    - name: Terminate instances
      local_action:
        module: ec2
        region: "{{region}}"
        keypair: "{{key_name}}"
        instance_ids: hostvars[{{ item }} ]['ec2_id']
        with_items: groups['tag_Name_Test']
        state: 'stopped'
        wait: yes

    - name: Give everyone a minute
      pause: minutes=1


The list is available in the debug message, but the  following fail
 instance_ids: hostvars[{{ item }} ]['ec2_id']
        with_items: groups['tag_Name_Test']
with
'item' is undefined

I have try all combinations of curly-brace but nothing seems to work.
In a similar way, I want to use the internal IP list as parameter for other task.

Thanks
Tzach 


Tom Bamford

unread,
Jan 15, 2015, 9:01:12 AM1/15/15
to ansible...@googlegroups.com

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

--
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/6c9e08aa-43d7-4329-a91c-a4a0b4f3f0e1%40googlegroups.com.

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

Tzach Livyatan

unread,
Jan 15, 2015, 10:00:05 AM1/15/15
to ansible...@googlegroups.com
Thanks Tom!
It works, but I do not understand how or why :)


On Thursday, January 15, 2015 at 4:01:12 PM UTC+2, Tom Bamford wrote:

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?
Reply all
Reply to author
Forward
0 new messages