register ec2 instance id and use it in ec2_ami module

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?

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).

Thanks, James. Upgrading Ansible from 1.8.1 to 1.8.2 and adding the braces totally did the job.

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.

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’