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.
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:
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;
jq
Befehl verwenden, um Json
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 '.[]'
this creates many "describe-instances" requests
und? Soweit ich verstanden habe, funktioniert Ihre Abfrage nur mit Tags, sie ist nicht universell, imho
Sehen Sie sich die ausführliche Dokumentation zur AWS-API an. ZB die aws-cli-Tools aws autoscaling beschreiben-automatisch-skalierende-Instanzen und aws ec2 beschreiben-Instanzen .
Ä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
Sie können auch jq
zum 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
jq
ein nützliches Werkzeug, und es hier verlassen kann ops Leute es entdecken lassen, auch wenn mit amazon Sie alles mit dem tun aws
Befehl
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.)
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/'))