2016-09-28 76 views
0

我有一个创建一个ec2实例的剧本,并从该创建我想注册输出为var。从那里我会使用注册的var创建并附加一个ebs卷。不过,我遇到了以下错误。注册ec2创建变量的问题

- name: Create EC2 instance for zone A 
    ec2: 
    key_name: "{{ keypair }}" 
    group: "{{ security_groups }}" 
    image: "{{ ami }}" 
    instance_type: "{{ instance_type }}" 
    wait: true 
    region: "{{ ec2_region }}" 
    vpc_subnet_id: "{{ subneta }}" 
    assign_public_ip: "{{ public_choice }}" 
    zone: "{{ zonea }}" 
    count: 1 
    instance_tags: 
     Name: "db{{ item }}a.{{ env }}" 
     envtype: "{{ envtype }}" 
    register: ec2 
    with_sequence: "start=1 end={{ num }}" 


- debug: 
    msg: "{{ ec2 }}" 
- debug: 
    msg: "{{ ec2.instance_ids }}" 

有了这个,我得到以下输出

[email protected]:/etc/ansible/roles/db_ec2/tasks > ansible-playbook db_ec2.yml -e 'env=qa num=1 ebs=true' 
______ 
<PLAY> 
------ 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

______________________ 
< TASK [db_ec2 : fail] > 
---------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

_______________________ 
< TASK [db_ec2 : debug] > 
----------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

ok: [localhost] => { 
    "msg": "If you need to change any default variables for this playbook edit vars/qa.yml and vars/ebs.yml for ebs configs" 
} 
_________________________ 
< TASK [db_ec2 : include] > 
------------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

included: /etc/ansible/roles/db_ec2/tasks/./db_create.yml for localhost 
________________________________________________ 
< TASK [db_ec2 : Create EC2 instance for zone A] > 
------------------------------------------------ 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

changed: [localhost] => (item=1) 
_______________________ 
< TASK [db_ec2 : debug] > 
----------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

ok: [localhost] => { 
    "msg": { 
     "changed": true, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_no_log": false, 
       "changed": true, 
       "instance_ids": [ 
        "i-1046c108" 
       ], 
       "instances": [ 
        { 
         "ami_launch_index": "0", 
         "architecture": "x86_64", 
         "block_device_mapping": { 
          "/dev/sda1": { 
           "delete_on_termination": true, 
           "status": "attached", 
           "volume_id": "vol-55812edd" 
          } 
         }, 
         "dns_name": "", 
         "ebs_optimized": false, 
         "groups": { 
          "sg-749f3c0d": "qa-ssh", 
          "sg-8f983bf6": "qa-db" 
         }, 
         "hypervisor": "xen", 
         "id": "i-1046c108", 
         "image_id": "ami-55e31a35", 
         "instance_type": "m4.xlarge", 
         "kernel": null, 
         "key_name": "ccpkey", 
         "launch_time": "2016-09-28T00:28:00.000Z", 
         "placement": "us-west-2a", 
         "private_dns_name": "ip-10-50-36-201.us-west-2.compute.internal", 
         "private_ip": "10.50.36.201", 
         "public_dns_name": "", 
         "public_ip": null, 
         "ramdisk": null, 
         "region": "us-west-2", 
         "root_device_name": "/dev/sda1", 
         "root_device_type": "ebs", 
         "state": "running", 
         "state_code": 16, 
         "tags": { 
          "Name": "db1a.qa", 
          "envtype": "qa-db" 
         }, 
         "tenancy": "default", 
         "virtualization_type": "hvm" 
        } 
       ], 
       "invocation": { 
        "module_args": { 
         "assign_public_ip": false, 
         "aws_access_key": null, 
         "aws_secret_key": null, 
         "count": 1, 
         "count_tag": null, 
         "ebs_optimized": false, 
         "ec2_url": null, 
         "exact_count": null, 
         "group": [ 
          "qa-db", 
          "qa-ssh" 
         ], 
         "group_id": null, 
         "id": null, 
         "image": "ami-55e31a35", 
         "instance_ids": null, 
         "instance_profile_name": null, 
         "instance_tags": { 
          "Name": "db1a.qa", 
          "envtype": "qa-db" 
         }, 
         "instance_type": "m4.xlarge", 
         "kernel": null, 
         "key_name": "ccpkey", 
         "monitoring": false, 
         "network_interfaces": null, 
         "placement_group": null, 
         "private_ip": null, 
         "profile": null, 
         "ramdisk": null, 
         "region": "us-west-2", 
         "security_token": null, 
         "source_dest_check": true, 
         "spot_price": null, 
         "spot_type": "one-time", 
         "spot_wait_timeout": 600, 
         "state": "present", 
         "tenancy": "default", 
         "termination_protection": false, 
         "user_data": null, 
         "validate_certs": true, 
         "volumes": null, 
         "vpc_subnet_id": "subnet-5d625c39", 
         "wait": true, 
         "wait_timeout": 300, 
         "zone": "us-west-2a" 
        }, 
        "module_name": "ec2" 
       }, 
       "item": "1", 
       "tagged_instances": [] 
      } 
     ] 
    } 
} 
_______________________ 
< TASK [db_ec2 : debug] > 
----------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'instance_ids'"} 
____________ 
< PLAY RECAP > 
------------ 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

localhost     : ok=4 changed=1 unreachable=0 failed=1 

所以我可以看到,应该存在变量确实在充分EC2变量的输出。但是,试图利用ec2.instance_ids的失败的关键特定变量...

编辑时:

这似乎是特定于with_sequence。如果我删除序列并将其更改为这样的内容。

- name: Create EC2 instance for zone A 
    ec2: 
    key_name: "{{ keypair }}" 
    group: "{{ security_groups }}" 
    image: "{{ ami }}" 
    instance_type: "{{ instance_type }}" 
    region: "{{ ec2_region }}" 
    vpc_subnet_id: "{{ subneta }}" 
    assign_public_ip: "{{ public_choice }}" 
    zone: "{{ zonea }}" 
    count: "{{ num }}" 
    wait: true 
    instance_tags: 
     envtype: "{{ envtype }}" 
    register: ec2 

- debug: 
    msg: "{{ item.id }}" 
    with_items: "{{ ec2.instances }}" 

我不再有任何错误,它打印实例ID没有问题。

回答

1

不知道如何with_sequence会影响到这里,但我看到这里至少有一个基本问题。

当您注册EC2任务的一个名为“EC2”可变输出,你可以参考instance_ids具有以下 -

ec2.results[0].instance_ids 

Ansible任务是抱怨,因为没有命名为顶级键“ “ec2”中的“instance_ids”,而是出现在“ec2”中的“results”键中。

希望这是有道理的,除非我错误地解释你的问题。

+0

啊,那完全是我所错过的。在这里谢谢你的答案,这正是我所需要的。 – stobiewankenobi

+0

酷!很高兴帮助! – rk2