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.

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;

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 '.[]'


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

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

JFYI: aws cli alredy kann json über die Option --query filtern.
ALex_hha


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.)


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
}

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/'))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.