Comment obtenir les adresses IP des instances du groupe Autoscaling

16

Comment puis-je obtenir des adresses IP privées de toutes les instances qui font partie d'un groupe AutoScaling. J'essaie de faire une opération sur toutes les instances qui font partie d'un groupe de mise à l'échelle automatique.

Ramesh Kumar
la source

Réponses:

16

J'ai écrit un petit script comme ci-dessous pour obtenir la liste IP:

#! / bin / bash
pour i dans `aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
faire
aws ec2 describe-instances --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | tête -1 | cut -d "," -f1
terminé;
Ramesh Kumar
la source
voter de toutes mes mains
Jameel Grand
downvote car il est imprudent d'analyser json avec grep et awk
xenoterracide
vous pouvez utiliser la jqcommande pour analyser json
Chase T.
Réponse parfaite, merci.
John Humphreys - w00te
10

Comme alternative, ma version sans 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

Version plus optimisée

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

Si vous avez juste besoin d'une simple liste dans la sortie, vous pouvez ajouter un autre pipeline

| jq -r '.[]'

ALex_hha
la source
cela crée de nombreuses requêtes "describe-instances", la mienne n'en crée qu'une, je veux dire, vous ne pouvez en créer que deux, mais vous devez arrêter d'utiliser xargs
xenoterracide
this creates many "describe-instances" requestset? Pour autant que je sache, votre requête ne fonctionnera qu'avec des balises, ce n'est pas universel, à mon humble avis
ALex_hha
Le vôtre n'est pas universel non plus. Je ne peux pas réellement utiliser le nom dans mes requêtes, c'est un nom généré qui fait partie d'un système automatisé. Le point est que cela crée 10 + 1 demandes RPC, donc cela sera lent en fonction du nombre d'instances que vous avez
xenoterracide
En fait, OP n'a pas précisé par quels critères il doit effectuer une recherche, c'est donc une zone grise :)
ALex_hha
Oui, je sais, je suggérais simplement que vous puissiez rendre les requêtes plus efficaces
xenoterracide
1

Similaire à la réponse de Ramesh, voici un joli petit script basé sur l'instance actuelle et son groupe. Assurez-vous de définir votre région et dans ce cas, je saute l'instance actuelle (utilisée pour le clustering). Vous pouvez également changer PrivateIpAddress en Public si nécessaire.

#!/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 merveilles
la source
1

vous pouvez également utiliser jqpour analyser la sortie, c'est une mauvaise idée d'utiliser awk, grep ou sed, etc., pour analyser une structure de nœud, similaire à une mauvaise idée d'utiliser des expressions régulières pour analyser 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
xénoterracide
la source
JFYI: aws cli alredy peut filtrer json via l'option --query.
ALex_hha
Ne semble pas fonctionner exactement de la même manière
xenoterracide
mais oui, c'est une autre façon de le faire.
xenoterracide
jetez un oeil à ma version
ALex_hha
Je vais laisser cela ici, car même si ce n'est pas la meilleure réponse, je pense que jqc'est un outil utile, et le laisser ici peut laisser les ops le découvrir, même si avec amazon vous pouvez tout faire avec la awscommande
xenoterracide
0

Vous pouvez également consulter l'interface utilisateur de la console Web AWS sous EC2 -> Groupes Auto Scaling -> onglet Instances. Vous verrez toutes les instances sous l'ASG actuel, vous pouvez ensuite cliquer sur chaque instance-ID pour obtenir l'IP (il vous redirigera vers une vue différente.)

mindblowwn
la source
Oui, mais je veux la liste complète, j'ai ASG avec plus de 100 instances et je veux une liste d'adresses IP pour appliquer certaines choses.
Ramesh Kumar
Voici le petit script que j'ai écrit pour obtenir la liste IP.
Ramesh Kumar
dans ce cas, j'utiliserais cli, vous avez raison.
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
la source
0

Cela renverra toutes les ips privées des instances dans un 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
la source