1

I wrote an ansible task to create ec2 instance and add the host as dynamic host. The task is working perfectly and created the instance, But Am not able to retrieve instance information.

My Ansible version : 2.2.0.0 / Ubuntu 14.04

Here is my code

- name: launch ec2 instance for QA
  local_action:
    module: ec2
    key_name: "{{ ec2_keypair }}"
    group: "{{ ec2_security_group }}"
    instance_type: "{{ ec2_instance_type }}"
    image: "{{ ec2_image }}"
    vpc_subnet_id: "{{ ec2_subnet_ids }}"
    region: "{{ ec2_region }}"
    instance_tags: '{"Name":"{{ec2_tag_Name}}","Type":"{{ec2_tag_Type}}","Environment":"{{ec2_tag_Environment}}"}'
    assign_public_ip: yes
    wait: true
    count: 1
  register: ec2

- debug: var=item
  with_items: ec2.instances

- add_host: name={{ item.public_ip }} >
           groups=dynamically_created_hosts
  with_items: ec2.instances

- name: Wait for the instances to boot by checking the ssh port
  wait_for: host={{item.public_ip}} port=22 delay=60 timeout=320 state=started
  with_items: ec2.instances

The output what am getting is:

TASK [launch ec2 instance for QA] **********************************************
changed: [localhost -> localhost]

TASK [debug] *******************************************************************
ok: [localhost] => (item=ec2.instances) => { "item": "ec2.instances" }

TASK [add_host] ****************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'unicode object' has no attribute 'public_ip'\n\nThe error appears to have been in '/var/lib/jenkins/jobs/QA/workspace/dynamic-ec2.yml': line 37, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - add_host: name={{ item.public_ip }} >\n ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n with_items:\n - {{ foo }}\n\nShould be written as:\n\n with_items:\n - \"{{ foo }}\"\n"}

Is there any other way to do this?

techraf
  • 64,883
  • 27
  • 193
  • 198
rolz
  • 591
  • 2
  • 11
  • 23

1 Answers1

5

You cannot use bare variables in 2.2. The syntax has been deprecated and users were warned since version 2.0.

You should read the error message you have pasted, and although it suggests a different reason, you should follow the example given:

Should be written as:
  with_items:
    - "{{ foo }}"

In your case it's enough to replace all with_items: ec2.instances with:

with_items: "{{ ec2.instances }}"
techraf
  • 64,883
  • 27
  • 193
  • 198