I am launching one-off ec2 instance for development purposes and in the main playbook I am launching an EC2 instance then assigning an elastic IP. Once all of that is done I am configuring the server via a role. I am able to capture the elastic IP via register but how do I call it from the role? Or more specifically how can I call it in a configuration template from within the role that is applied?
Here's an example:
launch-server.yml:
- name: Launch ec2 instance
hosts: localhost
gather_facts: False
vars:
key_name: ssh-key
instance_type: t2.medium
group_id: sg-f834234
image: ami-b234234
region: us-east-1
vpc_subnet_id: subnet-65wer234
tasks:
- name: Launch instance
local_action: ec2 key_name={{ key_name }} group_id={{ group_id }} instance_type={{ instance_type }} image={{ image }} wait=true region={{ region }} vpc_subnet_id={{ vpc_subnet_id }} instance_tags='{"Name":"ec2-instance"}'
register: ec2
- name: allocate a new elastic IP without associating it to anything
action: ec2_eip region=us-east-1
register: eiptest
- name: output the IP
debug: msg="Allocated IP is {{ eiptest.public_ip }}" <--- this prints the elastic IP to the screen.
- name: Add new instance to host group
local_action: add_host hostname={{ item.private_ip }} groupname=launched
with_items: ec2.instances
- name: Wait for SSH to come up
local_action: wait_for host={{ item.private_ip }} port=22 delay=60 timeout=320 state=started
with_items: ec2.instances
- name: Configure instance
hosts: launched
sudo: True
gather_facts: True
roles:
- myrole
In the template from within the role it doesn't know about eiptest.public_ip so it fails and reading the docs it seems that var will be destroyed at the end of the play that calls the role. If I run ansible hostname -m setup I don't see any entries for the elastic IP assigned to the instance.
I've tried a number of things and read through the docs but not having much luck. I would like to keep the roles separate from the plays that launch the instances if at all possible.
Thanks!