register ec2 instance id and use it in ec2_ami module

2,122 views
Skip to first unread message

Navid Paya

unread,
Dec 11, 2014, 9:36:35 AM12/11/14
to ansible...@googlegroups.com
Hi all
I'm trying to make some kind of automation to create an AMI out of an EC2 instance. So I have this chunk that creates the instance:

- name: Launch an Ubuntu 14.04 EC2 instance
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
  - name: Find the latest Ubuntu AMI
    ec2_ami_search: distro=ubuntu release=trusty region=ap-southeast-1 store=ebs-ssd virt=hvm
    register: ubuntu_image
  - name: Start the new EC2 instance
    ec2:
      image: "{{ ubuntu_image.ami }}"
      region: ap-southeast-1
      zone: ap-southeast-1b
      instance_type: t2.small
      vpc_subnet_id: xxxxxxxxxxxxxxxx
      group_id: ['sg-xxxxxxxx', 'sg-xxxxxxx']
      key_name: random_key
      wait: yes
      wait_timeout: 500
    register: ec2
  - name: Add the new instance to host group
    add_host: hostname={{ item.private_ip }} groupname=launched
    with_items: ec2.instances
  - name: Wait for SSH to come up on the new instance
    wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=320 state=started
    with_items: ec2.instances

Then I try to use the instance and generate an AMI out of that:

- name: Create an AMI from the provisioned instance
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
  - ec2_ami: region=ap-southeast-1 instance_id={{ item.id }} wait=no name=basebox-2000000
    with_items:
      - ec2.instances

- name: Delete the instance now that the AMI is created
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
  - ec2:
      region: ap-southeast-1
      instance_ids: "{{ item.id }}"
      state: 'absent'
    with_items:
      - ec2.instances

But I get errors like this:


TASK: [ec2_ami region=ap-southeast-1 instance_id={{ item.id }} wait=no name=basebox-2000000] ***
fatal: [localhost] => One or more undefined variables: 'str object' has no attribute 'id'

I guess I'm missing something with iterating over a hash but can't figure what. Any ideas?

James Cammarata

unread,
Dec 11, 2014, 10:31:24 AM12/11/14
to ansible...@googlegroups.com
Hi Navid, what version of Ansible are you running? You might try using jinja2 braces around the ec2.instances variable in the with_items list, as there was a bug recently about variables like that not expanding properly (which should be fixed in 1.8.2).

--
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/cc359c02-afd3-4c71-931d-7c5db8fde6a6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Navid Paya

unread,
Dec 11, 2014, 8:21:42 PM12/11/14
to ansible...@googlegroups.com
Thanks, James. Upgrading Ansible from 1.8.1 to 1.8.2 and adding the braces totally did the job.

--
You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/VkA8f77Pn9E/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.

To post to this group, send email to ansible...@googlegroups.com.

Stuart Davidson

unread,
Mar 31, 2015, 8:22:36 AM3/31/15
to ansible...@googlegroups.com
Hey Navid, you couldn't post an example could you? 

I seem to be running into the same problem as you, but 1.8.2 nor the brackets are fixing the problem.

Navid Paya

unread,
Mar 31, 2015, 9:55:54 AM3/31/15
to ansible...@googlegroups.com
Hi Stuart
This works fine for me with Ansible 1.8 onwards:

  - name: Create an AMI from the provisioned instance
    ec2_ami: region=ap-southeast-1 instance_id={{ item.id }} name=baseami-{{ timestamp.stdout }} wait=yes wait_timeout=600
    with_items:
      - "{{ ec2.instances }}"
    register: instance
  - name: Delete the instance now that the AMI is created
    ec2:
      region: ap-southeast-1
      instance_ids: "{{ ec2.instance_ids }}"
      state: 'absent'

Reply all
Reply to author
Forward
0 new messages