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.

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é;

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


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

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

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


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
}

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/'))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.