Jak uzyskać adresy IP grupy automatycznego skalowania

16

Jak mogę uzyskać prywatne adresy IP wszystkich instancji, które są częścią grupy AutoScaling. Próbuję wykonać operację na wszystkich instancjach należących do grupy skalowania automatycznego.

Ramesh Kumar
źródło

Odpowiedzi:

16

Napisałem mały skrypt, jak poniżej, aby uzyskać listę adresów IP:

#! / bin / bash
for i in `aws autoskalowanie opisz-auto-skalowanie grup -auto-skalowanie-nazwa-grupy ASGName | grep -i instanceid | awk '{print 2 USD}' | cut -d ',' -f1 | sed -e 's / "// g'`
robić
aws ec2 description-instances --instance-ids $ i | grep -i PrivateIpAddress | awk '{print 2 USD}' | głowa -1 | cut -d "," -f1
gotowy;
Ramesh Kumar
źródło
głosowanie wszystkimi moimi rękami
Jameel Grand
oddaj głos, ponieważ nierozsądnie jest parsować JSona przy pomocy grep i awk
xenoterracide
możesz użyć jqpolecenia do parsowania json
Chase T.
Idealna odpowiedź, dziękuję.
John Humphreys - w00te
10

Alternatywnie, moja wersja bez 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

Bardziej zoptymalizowana wersja

# 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"
]

Jeśli potrzebujesz tylko prostej listy w danych wyjściowych, możesz dodać kolejny potok

| jq -r '.[]'

ALex_hha
źródło
tworzy to wiele próśb o „opisanie instancji”, moje tylko jedno, to znaczy, możesz zrobić to tylko twom, ale musisz przestać używać xargs
xenoterracide
this creates many "describe-instances" requestsi? O ile rozumiem, twoje zapytanie będzie działać tylko z tagami, nie jest uniwersalne,
imho
Twoje nie jest uniwersalne, tak naprawdę nie mogę użyć nazwy w moich zapytaniach, to nazwa wygenerowana, która jest częścią zautomatyzowanego systemu. Chodzi o to, że tworzy to 10 żądań RPC plus 1, dlatego będzie powolne, w zależności od tego, ile wystąpień masz
xenoterracide
Właściwie OP nie określił, według jakich kryteriów musi przeprowadzić wyszukiwanie, więc jest to szary obszar :)
ALex_hha
Tak, wiem, więc sugerowałem, że możesz sprawić, by zapytania były bardziej wydajne
xenoterracide,
1

Podobna do odpowiedzi Ramesha tutaj jest ładny mały skrypt oparty na bieżącej instancji i jej grupie. Upewnij się, że ustawiłeś swój region. W tym przypadku pomijam bieżącą instancję (używaną do tworzenia klastrów). W razie potrzeby możesz także zmienić PrivateIpAddress na 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
7 odpowiedzi
źródło
1

możesz także użyć jqdo parsowania danych wyjściowych, złym pomysłem jest użycie awk, grep lub sed, itp. do parsowania struktury węzłów, podobnie jak złym pomysłem jest używanie wyrażeń regularnych do parsowania 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
ksenoterracid
źródło
JFYI: aws cli alredy może filtrować json poprzez opcję --query.
ALex_hha,
Nie wydaje się, aby działał dokładnie w ten sam sposób
Xenoterracide
ale tak, to inny sposób na zrobienie tego.
ksenoterrakid
po prostu spójrz na moją wersję
ALex_hha,
Zostawię to tutaj, ponieważ nawet jeśli nie jest to najlepsza odpowiedź, myślę, że jqjest to przydatne narzędzie, a pozostawienie go tutaj może pozwolić ops ludziom odkryć to, nawet jeśli dzięki aws
amazonowi
0

Możesz także zajrzeć do interfejsu konsoli AWS w interfejsie EC2 -> Grupy skalowania automatycznego -> Karta Instancje. Zobaczysz wszystkie instancje w bieżącym ASG, możesz następnie kliknąć ID każdej instancji, aby uzyskać adres IP (przekieruje Cię do innego widoku).

mindblowwn
źródło
Tak, ale chcę pełną listę, mam ASG z ponad 100 instancjami i chcę listę adresów IP, aby zastosować pewne rzeczy.
Ramesh Kumar,
Poniżej znajduje się mały skrypt, który napisałem, aby uzyskać listę adresów IP.
Ramesh Kumar,
w takim przypadku użyłbym cli, masz rację.
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
}
Jeremy
źródło
0

Zwróci to wszystkie prywatne IP instancji w 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/'))
Josh Edwards
źródło