如何获取 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 实例上部署和更新应用程序?
旧数据仍来自 Auto Scaling 组中的 EC2 实例
在 Auto Scaling 组中,确保在给定的可用区中至少有一个 ec2 实例始终可用