2016-11-24 16 views
0

Я пытаюсь запустить кучу экземпляров EC2, а затем установить что-то на них на основе IP, предоставленного AWS. Имея только один EC2, я могу добавить хост и продолжить без каких-либо проблем, но когда я их связываю с помощью with_dict, я больше не могу этого достичь ...Ansible: подготовка и итерации EC2

Следующие прогоны, как я хочу, но я не могу понять, как иметь дело с зарегистрированными переменной ec2_infos я получил от предоставления ...

- name: Create Test EC2 instances 
     ec2: 
     group: default 
     image: ami-40d28157 
     instance_type: '{{item.value.type}}' 
     instance_tags: 
      Name: "{{ tag+'-'+item.value.name }}" 
     key_name: privatekey 
     region: us-west-1 
     vpc_subnet_id: subnet-REDACTD 
     wait: yes 
     with_dict: '{{ec2_stack}}' 
     register: ec2_infos 

с словарем как

ec2_stack: 
    serv1: 
     type: t2.micro 
     name: server1 
    serv2: 
     type: t2.small 
     name: server2 

ec2_infos это такие структуры, как:

"ec2_infos": { 
    "changed": true, 
    "msg": "All items completed", 
    "results": [ 
     { 
      "_ansible_item_result": true, 
      "_ansible_no_log": false, 
      "_ansible_parsed": true, 
      "changed": true, 
      "instance_ids": [ 
       "i-0fewq09812ddq6" 
      ], 
      "instances": [ 
       { 
        "ami_launch_index": "0", 
        "architecture": "x86_64", 
        "block_device_mapping": { 
         "/dev/sda1": { 
          "delete_on_termination": true, 
          "status": "attached", 
          "volume_id": "vol-0987654" 
         } 
        }, 
        "dns_name": "", 
        "ebs_optimized": false, 
        "groups": { 
         "sg-qdwdww": "default" 
        }, 
        "hypervisor": "xen", 
        "id": "i-083665656521dwq6", 
        "image_id": "ami-40d28157", 
        "launch_time": "2016-11-24T20:38:53.000Z", 
        "placement": "us-west-1d", 
        "private_ip": "x.x.x.x", 
        "public_dns_name": "", 
        "public_ip": null, 
        "ramdisk": null, 
        "region": "us-east-1", 
        "root_device_name": "/dev/sda1", 
        "root_device_type": "ebs", 
        "state": "running", 
        "state_code": 16, 
        "tags": { 
         "Name": "server1", 
         "Team": "blah" 
        }, 
        "tenancy": "default","tenancy": "default", 
        "virtualization_type": "hvm" 
       } 
      ], 
      "invocation": { 
       "module_args": { 
        "assign_public_ip": false, 
        "exact_count": null, 
        "group": [ 
         "default" 
        ], 
        "group_id": null, 
        "id": null, 
        "image": "ami-40d28157", 
        "instance_ids": null, 
        "instance_initiated_shutdown_behavior": null, 
        "instance_profile_name": null, 
        "instance_tags": { 
         "Name": "server1", 
         "Team": "blah" 
        }, 
        "instance_type": "t2.micro", 
        "kernel": null, 
        "volumes": null, 
        "vpc_subnet_id": "subnet-abcdfed", 
        "wait": true, 
        "wait_timeout": "300", 
        "zone": null 
       }, 
       "module_name": "ec2" 
      }, 
      "item": { 
       "key": "serv1", 
       "value": { 
        "name": "server1", 
        "type": "t2.micro" 
       } 
      }, 
      "tagged_instances": [] 
     }, 
     { 
      "_ansible_item_result": true, 
      "_ansible_no_log": false, 
      "_ansible_parsed": true, 
      "changed": true, 
      "instance_ids": [ 
       "i-0971278624334fd" 
      ], 
      "instances": [ 
       { 
        "ami_launch_index": "0", 
        "architecture": "x86_64", 
        "block_device_mapping": { 
         "/dev/sda1": { 
          "delete_on_termination": true, 
          "status": "attached", 
          "volume_id": "vol-9999999" 
         } 
        }, 
        "dns_name": "", 
        "ebs_optimized": false, 
        "groups": { 
         "sg-redactd": "default" 
        }, 
        "launch_time": "2016-11-24T20:39:21.000Z", 
        "private_ip": "y.y.y.y", 
        "public_dns_name": "", 
        "public_ip": null, 
        "ramdisk": null, 
        "state": "running", 
        "state_code": 16, 
        "tags": { 
         "Name": "serv2", 
         "Team": "blah" 
        }, 
        "tenancy": "default", 
        "virtualization_type": "hvm" 
       } 
      ], 
      "invocation": { 
       "module_args": { 
        "assign_public_ip": false, 

        "wait_timeout": "300", 
        "zone": null 
       }, 
       "module_name": "ec2" 
      }, 
      "item": { 
       "key": "server2", 
       "value": { 
        "name": "serv2", 
        "type": "t2.small" 
       } 
      }, 
      "tagged_instances": [] 
     } 
    ] 
} 

Я попробовал with_items и with_subelements по-разному, но мне не удается получить все IP-адреса нового EC2. Мне даже не нужно сортировать их, просто извлекайте их из части экземпляров и кормите их в add_host, чтобы я мог продолжить.

Кто-нибудь знает, как это сделать, или будет достаточно любезным, чтобы объяснить мне, как правильно обращаться с зарегистрированной переменной после цикла?

+0

Я не могу ответить без точного 'ec2_infos' формат, но вы должны начать с' ec2_infos.results | map (attribute = 'экземпляры') | sum (start = []) 'и' map' для 'private_ip' в зависимости от формата точного объекта. –

+0

Спасибо, что работает! Не могли бы вы опубликовать его в качестве ответа, чтобы я мог принять его? Или я должен делать это, цитируя ваш комментарий? – Hiruma

ответ

0

Ответ от комментариев:

ec2_infos.results | map(attribute='instances') | sum(start=[]) | map(attribute='private_ip') | list