So erhalten Sie Autoscaling-Gruppeninstanzen IP-Adressen

16

Wie kann ich private IP-Adressen aller Instanzen abrufen, die Teil einer AutoScaling-Gruppe sind? Ich versuche, einige Operationen auf allen Instanzen auszuführen, die Teil einer Autoscaling-Gruppe sind.

Ramesh Kumar
quelle

Antworten:

16

Ich habe ein kleines Skript wie das folgende geschrieben, um die IP-Liste zu erhalten:

#! / bin / bash
for i in `aws autoscaling beschreibe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed-es / "// g'`
tun
aws ec2 beschreiben-Instanzen --Instanz-IDs $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | head -1 | schneiden Sie -d "," -f1
erledigt;
Ramesh Kumar
quelle
mit all meinen händen upvoting
Jameel Grand
downvote weil es unklug ist json mit grep und awk zu parsen
xenoterracide
Sie können jqBefehl verwenden, um Json
Chase T.
Perfekte Antwort, danke.
John Humphreys - w00te
10

Als Alternative meine Version ohne 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

Optimierte Version

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

Wenn Sie nur eine einfache Liste in der Ausgabe benötigen, können Sie eine weitere Pipeline hinzufügen

| jq -r '.[]'

ALex_hha
quelle
dies erzeugt viele "describe-instance" -Anfragen, meine erstellt nur eine, ich meine, Sie könnten es nur für zwei erstellen, aber Sie müssten aufhören, xargs zu verwenden
xenoterracide
this creates many "describe-instances" requestsund? Soweit ich verstanden habe, funktioniert Ihre Abfrage nur mit Tags, sie ist nicht universell, imho
ALex_hha
Ihr Name ist auch nicht universell. Ich kann den Namen in meinen Abfragen nicht verwenden. Es handelt sich um einen generierten Namen, der Teil eines automatisierten Systems ist. Der Punkt ist, dass dies 10 plus 1 RPC-Anforderungen erzeugt, daher wird es langsam sein, abhängig davon, wie viele Instanzen Sie haben
Xenoterracide
Tatsächlich hat OP nicht angegeben, nach welchen Kriterien er eine Suche durchführen muss, daher ist es ein grauer Bereich :)
ALex_hha
Ja, ich weiß, also habe ich nur vorgeschlagen, dass Sie die Abfragen effizienter gestalten können
Xenoterracide
1

Ähnlich wie bei Ramesh ist hier ein nettes kleines Skript, das auf der aktuellen Instanz und ihrer Gruppe basiert. Stellen Sie sicher, dass Sie Ihre Region festlegen. In diesem Fall überspringe ich die aktuelle Instanz (die für das Clustering verwendet wird). Sie können bei Bedarf auch PrivateIpAddress in Public ändern.

#!/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
7wunder
quelle
1

Sie können auch jqzum Parsen der Ausgabe verwenden. Es ist eine schlechte Idee, awk, grep oder sed usw. zum Parsen einer Knotenstruktur zu verwenden, ähnlich wie es eine schlechte Idee ist, reguläre Ausdrücke zum Parsen von HTML zu verwenden.

$ 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
Xenoterracid
quelle
JFYI: aws cli alredy kann json über die Option --query filtern.
ALex_hha
Scheint
Aber ja, das ist eine andere Möglichkeit.
Xenoterracide
Schauen Sie sich einfach meine Version an
ALex_hha
Ich werde dies hier verlassen, denn auch wenn es nicht die beste Antwort ist, denke ich , ist jqein nützliches Werkzeug, und es hier verlassen kann ops Leute es entdecken lassen, auch wenn mit amazon Sie alles mit dem tun awsBefehl
xenoterracide
0

Sie können auch in der Benutzeroberfläche der AWS-Webkonsole unter EC2 -> Auto Scaling Groups -> Instances Tab nachsehen. Sie sehen alle Instanzen unter der aktuellen ASG. Sie können dann auf jede Instanz-ID klicken, um die IP zu erhalten. (Sie werden dann zu einer anderen Ansicht weitergeleitet.)

verblüffend
quelle
Ja, aber ich möchte die vollständige Liste, ich habe ASG mit mehr als 100 Instanzen und möchte eine Liste von IPs, um einige Dinge anzuwenden.
Ramesh Kumar
Unten ist das kleine Skript, das ich geschrieben habe, um die IP-Liste zu erhalten.
Ramesh Kumar
In diesem Fall würde ich CLI verwenden, Sie sind richtig.
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
quelle
0

Dies gibt alle privaten IPS von Instanzen in einer ASG zurück

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
quelle