Как получить IP-адреса группы автомасштабирования Instances

16

Как я могу получить частные IP-адреса всех экземпляров, которые являются частью группы AutoScaling. Я пытаюсь выполнить некоторые операции на всех экземплярах, входящих в группу автоматического масштабирования.

Рамеш Кумар
источник

Ответы:

16

Я написал небольшой скрипт, как показано ниже, чтобы получить список IP-адресов:

#! / Bin / Баш
для i в `aws autoscaling-description-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
делать
aws ec2 description-instances --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | голова -1 | cut -d "," -f1
сделано;
Рамеш Кумар
источник
голосование всеми моими руками
Джамиль Гранд
downvote, потому что неразумно разбирать json с помощью grep и awk
xenoterracide
Вы можете использовать jqкоманду для разбора JSON
Chase T.
Идеальный ответ, спасибо.
Джон Хамфрис - w00te
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 '.[]'

ALex_hha
источник
это создает много запросов «описать экземпляры», мой только создает один, я имею в виду, вы можете заставить его создавать только twom, но вам придется прекратить использовать xargs
xenoterracide
this creates many "describe-instances" requestsи? Насколько я понял, ваш запрос будет работать только с тегами, он не универсален, imho
ALex_hha
Ваш не универсальный, я не могу использовать имя в моих запросах, это сгенерированное имя, которое является частью автоматизированной системы. Суть в том, что это создает 10 + 1 RPC-запросов, поэтому он будет медленным в зависимости от того, сколько у вас экземпляров
xenoterracide
На самом деле ОП не уточнил, по каким критериям ему нужно проводить поиск, поэтому это серая зона :)
ALex_hha
Да, я знаю, поэтому я просто предложил вам сделать запросы более эффективными
xenoterracide
1

Аналогично ответу Рамеша, здесь есть небольшой скрипт, основанный на текущем экземпляре и его группе. Убедитесь, что вы указали свой регион, и в этом случае я пропускаю текущий экземпляр (используется для кластеризации). При необходимости вы также можете изменить 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
7wonders
источник
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
xenoterracide
источник
JFYI: aws cli alredy может фильтровать json с помощью опции --query.
ALex_hha
Кажется, не работает точно так же
xenoterracide
но да, это еще один способ сделать это.
ксенотеррацид
просто посмотрите на мою версию
ALex_hha
Я собираюсь оставить это здесь, потому что, даже если это не самый лучший ответ, я думаю, что jqэто полезный инструмент, и если оставить его здесь, это может позволить ops людям обнаружить его, даже если с amazon вы можете сделать все это с помощью awsкоманды
xenoterracide
0

Вы также можете просмотреть пользовательский интерфейс веб-консоли AWS в разделе EC2 -> Группы автоматического масштабирования -> вкладка «Экземпляры». Вы увидите все экземпляры под текущим ASG, затем вы можете нажать на каждый экземпляр экземпляра, чтобы получить IP-адрес (он перенаправит вас в другое представление.)

mindblowwn
источник
Да, но я хочу полный список, у меня есть ASG с более чем 100 экземплярами, и я хочу, чтобы список IP-адресов применил некоторые вещи.
Рамеш Кумар
Ниже приведен небольшой скрипт, который я написал для получения списка IP-адресов.
Рамеш Кумар
в этом случае я бы использовал 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

Это вернет все частные ips экземпляров в ASG

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/'))
Джош Эдвардс
источник