I resolved this by doing the following: Instance launch stage:
- Setting the fact for the elastic IP - Writing the IP to a file using shell: After calling the role when SSH is available: - cat the same file and register result to a new variable (delegate_to: localhost) - Set a new fact - great success On Wednesday, December 10, 2014 2:11:41 PM UTC-6, [email protected] wrote: > > 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! > -- 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 [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/82882e1b-6a8e-4417-a2a3-59b0bbe5c722%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
