title: Creating n new instances in AWS EC2 VPC and then configuring them
body: <p>I'm having a really hard time doing what seems like a fairly standard task so I'm hoping somebody can help me.  I've googled this like crazy and most of the examples are not in VPC or use deprecated structure that makes them wrong or unusable in my use case.</p>
  
  <p>Here are my goals:</p>
  
  <ol>
  <li>I want to launch a whole mess of new instances in my VPC (the same
  code below has 3 but it could be a hundred) </li>
  <li>I want to wait for thoseinstances to come alive</li>
  <li>I then want to configure those instances (ssh into them, change
  hostname, enable some services, etc. etc.)</li>
  </ol>
  
  <p>Now I could probably do this in 2 tasks.  I could create the instances in 1 playbook.  Wait for them to settle down.  Then run a 2nd playbook to configure them.  That's probably what I'm going to do now because I want to get moving - but there has to be a one shot answer to this.</p>
  
  <p>Here's what I have so far for a playbook</p>
  
  <pre><code>---
  - hosts: localhost
    connection: local
    gather_facts: False
    tasks:
      - name: Provision Lunch
        with_items:
          - hostname: eggroll1
          - hostname: eggroll2
          - hostname: eggroll3
        ec2:
          region: us-east-1
          key_name: eggfooyong
          vpc_subnet_id: subnet-8675309
          instance_type: t2.micro
          image: ami-8675309
          wait: true
          group_id: sg-8675309
          exact_count: 1
          count_tag:
            Name: "{{ item.hostname }}"
          instance_tags:
            Name: "{{ item.hostname }}"
            role:   "supper"
            ansibleowned: "True"
        register: ec2
  
      - name: Wait for SSH to come up
        wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=900 state=started
        with_items: '{{ec2.instances}}'
  
      - name: Update hostname on instances
        hostname: name={{ item.private_ip }}
        with_items: '{{ec2.instances}}'
  </code></pre>
  
  <p>And that doens't work.  What I get is</p>
  
  <pre><code>TASK [Wait for SSH to come up] *************************************************
  [DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
  deprecation_warnings=False in ansible.cfg.
  
  TASK [Update hostname on instances] ********************************************
  [DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
  deprecation_warnings=False in ansible.cfg.
  </code></pre>
  
  <p>Which makes me sad.  Now this is my latest incarnation of that playbook.  But I've tried to rewrite it using every example I can find on the internet.  Most of them have with_items written in a different way, but ansible tells me that way is depricated, and then fails.</p>
  
  <p>So far ansible has been fun and easy, but this is making me want to toss my laptop across the street.  </p>
  
  <p>Any suggestions?  Should I be using register and with_items at all?  Would I be better off using something like this:</p>
  
  <pre><code>add_host: hostname={{item.public_ip}} groupname=deploy
  </code></pre>
  
  <p>instead?  I'm wide open to a rewrite here.  I'm going to go write this up in 2 playbooks and would love to get suggestions.</p>
  
  <p>Thanks!</p>
  
  <p>****EDIT****
  Now it's just starting to feel broken or seriously changed. I've googled dozens of examples and they all are written the same way and they all fail with the same error.  This is my simple playbook now:</p>
  
  <pre><code>---
  - hosts: localhost
    connection: local
    gather_facts: False
    vars:
      builderstart: 93
      builderend: 94
    tasks:
      - name: Provision Lunch
        ec2:
          region: us-east-1
          key_name: dakey
          vpc_subnet_id: subnet-8675309
          instance_type: t2.micro
          image: ami-8675309
          wait: True
          group_id: sg-OU812
          exact_count: 1
          count_tag:
            Name: "{{ item }}"
          instance_tags:
            Name: "{{ item }}"
            role:   "dostuff"
            extracheese: "True"
        register: ec2
        with_sequence: start="{{builderstart}}" end="{{builderend}}" format=builder%03d
  
  
      - name: the newies
        debug: msg="{{ item }}"
        with_items: "{{ ec2.instances }}"
  </code></pre>
  
  <p>It really couldn't be more straight forward.  No matter how I write it, no matter how I vary it, I get the same basic error:</p>
  
  <blockquote>
    <p>[DEPRECATION WARNING]: Skipping task due to undefined Error, in the
    future this will be a fatal error.: 'dict object' has no attribute
    'instances'.</p>
  </blockquote>
  
  <p>So it looks like it's the with_items: "{{ ec2.instances }}" line that's causing the error.</p>
  
  <p>I've used debug to print out ec2 and that error looks accurate.  It looks like the structure changed to me.  It looks like ec2 now contains a dictionary with results as a key to another dictionary object and that instances is a key in that dictionary.  But I can't find a sane way to access the data.</p>
  
  <p>For what it's worth, I've tried accessing this in 2.0.1, 2.0.2, and 2.2 and I get the same problem in every case.</p>
  
  <p>Are the rest of you using 1.9 or something?  I can't find an example anywhere that works.  It's very frustrating.</p>
  
  <p>Thanks again for any help.</p>