如何获取 Auto Scaling 组中实例的 IP

Posted

技术标签:

【中文标题】如何获取 Auto Scaling 组中实例的 IP【英文标题】:How to fetch IP of instances in an Auto scaling group 【发布时间】:2017-10-07 15:04:43 【问题描述】:

我一直在尝试获取我使用 paginator 列出并使用 print asg['AutoScalingGroupName'] 打印的每个 Auto Scaling 组中所有实例的 IP 详细信息

import boto
import boto3

client = boto3.client('autoscaling', region_name='us-west-2')
autoscale = boto.connect_autoscale()
ec2 = boto.connect_ec2()
paginator = client.get_paginator('describe_auto_scaling_groups')
page_iterator = paginator.paginate(PaginationConfig='PageSize': 100
)

filtered_asgs = page_iterator.search(
    'AutoScalingGroups[] | [?contains(Tags[?Key==``].Value, ``)]'.format('Application', 'CCP')
)

for asg in filtered_asgs:
    print asg['AutoScalingGroupName']
        group = autoscale.get_all_groups(asg['AutoScalingGroupName'])[0]
        instance_ids = [i.instance_id for i in group.instances]
        reservations = ec2.get_all_instances(instance_ids)
        instances = [i for r in reservations for i in r.instances]
        print instances

请帮我找出我在这里缺少的东西。

【问题讨论】:

您检查过this 和this 的答案吗? 是的,我将它添加到我的脚本中。您可以看到我已将 mygroupname 替换为循环中的 ASG 名称。好像我编码的方式不正确。你有什么建议吗?。 这个问题我不清楚。你有错误吗?它是否打印了一些东西?你在整个过程的哪一部分卡住了? 这是输出。 stg-ccp-asg Traceback (most recent call last): File "mar_test.py", line 17, in <module> group = autoscale.get_all_groups(asg['AutoScalingGroupName'])[0] IndexError: list index out of range 当我尝试打印组时,它什么也没显示。这意味着group = autoscale.get_all_groups(asg['AutoScalingGroupName'])[0] 没有输出。 请看这个输出.. dev-ccp-asg [] Traceback (most recent call last): File "mar_test.py", line 19, in <module> instance_ids = [i.instance_id for i in group.instances] AttributeError: 'ResultSet' object has no attribute 'instances' 它说该列表'组'中没有元素 【参考方案1】:

这个 sn-p 应该可以工作,你只需要添加你的特定过滤器:

#!/usr/bin/env python

import boto3

ec2 = boto3.resource('ec2')

def get_instances():
    client = boto3.client('autoscaling')
    paginator = client.get_paginator('describe_auto_scaling_groups')
    groups = paginator.paginate().build_full_result()

    for asg in groups['AutoScalingGroups']:
        print asg['AutoScalingGroupName']
        instance_ids = [i for i in asg['Instances']]
        running_instances = ec2.instances.filter(Filters=[])
        for instance in running_instances:
            print(instance.id, instance.public_dns_name, instance.private_ip_address)

if __name__ == '__main__':
    get_instances()

【讨论】:

我使用的过滤器仅用于根据其标签对 ASG 进行排序。您能否建议我如何在您的代码中引入以下过滤器。 filtered_asgs = page_iterator.search( 'AutoScalingGroups[] | [?contains(Tags[?Key==].Value, )]'.format('Application', 'CCP') )我自己试过,显示以下错误:AttributeError: 'dict' object has no attribute 'search' 你可以得到提示here 我已经为 EC2 实例使用过这个过滤器。但这在使用 boto3 的 ASG 上对我不起作用。这就是我如何找到像魅力一样工作的分页器技术。你的sn-p真的很好。但我无法在您的代码中应用我的 ASG 过滤器。当我这样做时,它会返回上述错误。 :(【参考方案2】:

@Lorena,你的建议真的很有帮助。

我已经正确地迭代过滤结果如下。

import boto3

ec2 = boto3.resource('ec2', region_name='us-west-2')

def get_instances():
        client = boto3.client('autoscaling', region_name='us-west-2')
        paginator = client.get_paginator('describe_auto_scaling_groups')
        groups = paginator.paginate(PaginationConfig='PageSize': 100)
        #print groups
        filtered_asgs = groups.search('AutoScalingGroups[] | [?contains(Tags[?Key==``].Value, ``)]'.format('Application', 'CCP'))

        for asg in filtered_asgs:
                print asg['AutoScalingGroupName']
                instance_ids = [i for i in asg['Instances']]
                running_instances = ec2.instances.filter(Filters=[])
                for instance in running_instances:
                        print(instance.private_ip_address)

if __name__ == '__main__':
    get_instances()

【讨论】:

太棒了,很高兴为您提供帮助:)【参考方案3】:

有点晚了,但我在这里发布我的版本。

我这样做是为了获取您通过调用 describe_auto_scaling_groups 获得的第一个自动缩放组的数据,并进行相应修改。

import boto3


ec2 = boto3.resource('ec2')
asg = boto3.client('autoscaling')

response= asg.describe_auto_scaling_groups(AutoScalingGroupNames=['myAutoScaleName',],)
groups=response.get("AutoScalingGroups")
instances=(groups[0].get('Instances'))

for i in instances:
    pubip=ec2.Instance(i.get('InstanceId')).public_ip_address
    print(pubip)

【讨论】:

以上是关于如何获取 Auto Scaling 组中实例的 IP的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?

使用 boto 列出 Auto Scaling 组中的实例

旧数据仍来自 Auto Scaling 组中的 EC2 实例

在 Auto Scaling 组中,确保在给定的可用区中至少有一个 ec2 实例始终可用

在关闭之前检查 Auto Scaling 组中的 EC2 实例是不是有任何用户在使用它

网络负载均衡器目标组中的 AWS Auto Scaling 目标