Як отримати групу автоматичного масштабування Екземпляри IP-адреси


16

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

Відповіді:


16

Я написав невеликий сценарій, як нижче, щоб отримати список IP:

#! / бін / баш
для я в `aws автоматичне масштабування описує-авто-масштабування -групи --авто-масштабування-ім'я групи ASGName | grep -i instanceid | awk '{print $ 2}' | вирізати -d ',' -f1 | sed -e 's / "// g'`
робити
aws ec2 описує-екземпляри --instica-ID $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | голова -1 | вирізати -d "," -f1
зроблено;

звернення всіх моїх рук
Jameel Grand

downvote, тому що нерозумно розбирати json з grep and 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 '.[]'


це створює багато запитів "опису-екземпляри", моє створює лише один, я маю на увазі, ви можете зробити його лише створенням twom, але вам доведеться припинити використання xargs
xenoterracide

this creates many "describe-instances" requestsі? Наскільки я зрозумів, ваш запит працюватиме лише з тегами, він не універсальний, imho
ALex_hha

Твоя не є універсальною, я не можу насправді використовувати це ім’я у своїх запитах, це генероване ім’я, яке є частиною автоматизованої системи. Справа в тому, що це створює 10 плюс 1 запитів RPC, тому воно буде повільним, залежно від кількості екземплярів
xenoterracide

Насправді ОП не визначав, за якими критеріями йому потрібно здійснити пошук, тому це сіра зона :)
ALex_hha

Так, я знаю, тому я просто пропонував зробити запити більш ефективними
ксенотеррацид


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

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 може фільтрувати json за допомогою параметра --query.
ALex_hha

Схоже, це не зовсім так
ксенотерракід

але так, це ще один спосіб зробити це.
ксенотеррацид

просто подивіться на мою версію
ALex_hha

Я збираюся залишити це тут, тому що навіть якщо це не найкраща відповідь, я вважаю jq, що це корисний інструмент, і залишаючи його тут, можливо, люди з aws
оперативними можливостями

0

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


Так, але я хочу повний список, я маю 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/'))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.