Ansible:EC2设置和迭代

平间

我正在尝试启动一堆EC2实例,然后根据AWS给定的IP在它们上安装一些东西。仅使用一个EC2,我就可以添加主机并继续进行而没有任何问题,但是当我使用with_dict链接它们时,我再也无法实现它了...

以下内容可以按我的意愿运行,但是我不明白如何处理从配置中获得的注册变量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,但是我无法设法获得新EC2的每个IP。我什至不需要对它们进行排序,只需将它们从实例部分中提取出来并将它们输入到add_host中,这样我就可以继续。

任何人都知道这样做的干净方法,或者足够友好地向我解释如何在循环后正确处理已注册的变量?

康斯坦丁·苏沃洛夫(Konstantin Suvorov)

来自评论的答案:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ansible和AWS EC2库存

来自分类Dev

Ansible和AWS EC2库存

来自分类Dev

何时出现ansible剧本:设置了条件ec2标签

来自分类Dev

如何为ec2实例设置ansible?

来自分类Dev

使用TFS和Amazon EC2设置CI环境

来自分类Dev

使用Vagrant和Puphpet设置AWS EC2实例

来自分类Dev

根据ec2版本动态设置ansible-playbook用户变量

来自分类Dev

使用Ansible设置EC2实例时遇到问题

来自分类Dev

根据ec2版本动态设置ansible-playbook用户变量

来自分类Dev

如何在Ansible和已经存在的EC2中使用自动缩放

来自分类Dev

AWS EC2密钥对设置

来自分类Dev

EC2上的Python uwsgi设置

来自分类Dev

EC2 - 设置环境变量

来自分类Dev

AWS EC2 FTPS 设置

来自分类Dev

在Amazon EC2实例和Django上设置HTTPS / SSL

来自分类Dev

在AWS EC2和S3中使用ELK设置Logserver

来自分类Dev

如何为RHEL Ec2实例设置用户名和密码访问

来自分类Dev

在测试厨房中使用 ec2 驱动程序设置 aws 标签和实例名称?

来自分类Dev

Boto Ec2和弹性IP

来自分类Dev

WildFly 10,JGroups和EC2

来自分类Dev

Boto Ec2和弹性IP

来自分类Dev

Docker EC2和端口绑定

来自分类Dev

亚马逊 API 网关和 EC2

来自分类Dev

在EC2实例上运行ansible任务

来自分类Dev

Ansible AWS EC2安全组未更新

来自分类Dev

Ansible ec2仅供应所需的服务器

来自分类Dev

Ansible动态库存无法获取最新的ec2信息

来自分类Dev

Ansible EC2动态库存最低IAM策略

来自分类Dev

使用Ansible启动AWS EC2实例的最佳方法