如何获得自动伸缩组实例IP地址


16

我如何获得属于AutoScaling组的所有实例的私有IP地址。我正在尝试对属于自动伸缩组的所有实例进行一些操作。

Answers:


16

我已经编写了一个如下所示的小脚本来获取IP列表:

#!/ bin / bash
for for aaws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk'{print $ 2}'| 切-d','-f1 | sed -e's /“ // g'`
做
aws ec2 describe-instances --instance-ids $ i | grep -i PrivateIpAddress | awk'{print $ 2}'| 头-1 | 切-d“,” -f1
完成

用我的双手进行投票
Jameel Grand

下注,因为用grep和awk解析json是不明智的
xenoterracide

您可以使用jq命令来解析json
Chase T.

完美的答案,谢谢。
约翰·汉弗莱斯

10

或者,我的版本没有任何jq / awk / sed / cut

$ aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG-GROUP-NAME'].InstanceId" \
| xargs -n1 aws ec2 describe-instances --instance-ids $ID --region us-east-1 \
--query "Reservations[].Instances[].PrivateIpAddress" --output text
10.228.43.71
10.230.178.160
10.228.15.171
10.233.160.163
10.228.18.123
10.225.222.195
10.237.149.97
10.136.163.109
10.152.35.71
10.233.157.230

更优化的版本

# aws ec2 describe-instances --region us-east-1 --instance-ids \
$(aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG_NAME'].InstanceId") \
--query "Reservations[].Instances[].PrivateIpAddress"
[
    "10.230.178.160",
    "10.152.35.71",
    "10.233.157.230",
    "10.237.149.97",
    "10.228.15.171",
    "10.136.163.109",
    "10.225.222.195",
    "10.233.160.163",
    "10.228.43.71",
    "10.228.18.123"
]

如果只需要输出中的简单列表,则可以添加另一个管道

| jq -r '.[]'


这创建了许多“描述实例”请求,我的只创建了一个,我的意思是,您可以使其仅创建twom,但是您必须停止使用xargs
xenoterracide

this creates many "describe-instances" requests和?据我了解,您的查询仅适用于非通用标签,恕我直言
ALex_hha

您的名字也不是通用的,或者我实际上不能在查询中使用该名称,它是自动系统中一部分的生成名称。关键是这会创建一个10加1的RPC请求,因此它会变慢,具体取决于您拥有多少个实例
xenoterracide

实际上,OP并没有指定他需要进行搜索的标准,所以它是灰色的区域:)
ALex_hha

是的,我知道,所以我只是建议您可以提高查询效率
xenoterracide


1

与Ramesh的答案类似,这是一个基于当前实例及其组的漂亮小脚本。确保设置您的区域,在这种情况下,我将跳过当前实例(用于集群)。如果需要,还可以将PrivateIpAddress更改为Public。

#!/bin/bash
wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
sudo chmod u+x ec2-metadata
INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk 'NR==1{print $2}')
AG_NAME=$(aws autoscaling describe-auto-scaling-instances --instance-ids ${INSTANCE_ID} --region eu-west-1 --query AutoScalingInstances[].AutoScalingGroupName --output text)
for ID in $(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ${AG_NAME} --region eu-west-1 --query AutoScalingGroups[].Instances[].InstanceId --output text);
do
    if [ "${ID}" == ${INSTANCE_ID} ] ; then
        continue;
    fi
    IP=$(aws ec2 describe-instances --instance-ids $ID --region eu-west-1 --query Reservations[].Instances[].PrivateIpAddress --output text)
    # Do what you want with ${IP} here
done

1

您还可以jq用来解析输出,使用awk,grep或sed等解析节点结构是一个坏主意,类似于使用正则表达式来解析html是一个坏主意。

$ aws ec2 describe-instances \
--instance-ids $(aws autoscaling describe-auto-scaling-groups \
    |jq -r '.AutoScalingGroups[]| select( .Tags[].Value == "playground").Instances[].InstanceId' \
    |paste -s -d" ") \
| jq -r '.Reservations[].Instances[].PrivateIpAddress'
192.169.0.202
192.169.0.177
192.169.0.160

JFYI:aws cli alredy可以通过--query选项过滤json。
ALex_hha

似乎工作方式并不完全相同
xenoterracide

但是,是的,这是另一种方式。
xenoterracide

看看我的版本
ALex_hha '17

我将把它留在这里,因为即使这不是最佳答案,我也认为这jq是一个有用的工具,把它留在这里可能会让操作人员发现它,即使使用亚马逊您也可以使用以下aws命令完成所有操作
xenoterracide

0

您还可以在AWS Web Console UI的EC2-> Auto Scaling Groups-> Instances选项卡下查找。您将看到当前ASG下的所有实例,然后可以单击每个实例ID以获得IP(它将您重定向到其他视图。)


是的,但是我想要完整的列表,我拥有拥有100多个实例的ASG,并且想要一个IP列表来应用一些东西。
拉梅什·库玛

以下是我为获取IP列表而编写的小脚本。
Ramesh Kumar

在那种情况下,我会使用cli,您是正确的。
mindblowwn

0
$instanceIPs = aws ec2 describe-instances --filters "Name=tag:Name,Values=<name-of-your-auto-scaling-group>" --query 'Reservations[].Instances[].PrivateDnsName' --output text

$instanceIPsArray = $instanceIPs.Trim() -split("`t")
foreach($ip in $instanceIPsArray)
{
    //Do something
}

0

这将返回ASG中实例的所有私有ip

PRIVATEIPS=$(aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=$(aws autoscaling describe-auto-scaling-instances --instance-ids="$(ec2metadata --instance-id)" | jq -r '.AutoScalingInstances[].AutoScalingGroupName')" --query 'Reservations[].Instances[].PrivateIpAddress' --output text --region $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.