Come ottenere indirizzi IP delle istanze del gruppo con scalabilità automatica


16

Come posso ottenere indirizzi IP privati ​​di tutte le istanze che fanno parte di un gruppo di AutoScaling. Sto cercando di eseguire alcune operazioni su tutte le istanze che fanno parte di un gruppo con scalabilità automatica.

Risposte:


16

Ho scritto un piccolo script come di seguito per ottenere l'elenco IP:

#! / Bin / bash
per i in `aws ridimensionamento automatico gruppi-ridimensionamento automatico - nome-gruppo-ridimensionamento automatico ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
fare
aws ec2 descrivono istanze --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | testa -1 | cut -d "," -f1
fatto;

votando con tutte le mie mani
Jameel Grand,

downvote perché non è saggio analizzare json con grep e awk
xenoterracide

puoi usare il jqcomando per analizzare json
Chase T.

Risposta perfetta, grazie.
John Humphreys - w00te,

10

In alternativa, la mia versione senza 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

Versione più ottimizzata

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

Se è necessario solo un semplice elenco nell'output, è possibile aggiungere un'altra pipeline

| jq -r '.[]'


questo crea molte richieste "descrivi istanze", il mio ne crea solo una, voglio dire, potresti farne solo due, ma dovresti smettere di usare xargs
xenoterracide

this creates many "describe-instances" requestse? Per quanto ho capito, la tua query funzionerà solo con tag non universali, imho
ALex_hha,

Il tuo non è universale, né in realtà non posso usare il nome nelle mie query, è un nome generato che fa parte di un sistema automatizzato. Il punto è che questo crea un 10 più 1 richieste RPC quindi sarà lento a seconda di quante istanze hai
xenoterracide

In realtà OP non ha specificato in base ai criteri di cui ha bisogno per effettuare una ricerca, quindi è un'area grigia :)
ALex_hha,

Sì, lo so, quindi stavo solo suggerendo che puoi rendere le query più efficienti
xenoterracide,


1

Simile alla risposta di Ramesh qui è un bel piccolo script basato sull'istanza corrente e sul suo gruppo. Assicurati di impostare la tua regione e in questo caso salto l'istanza corrente (utilizzata per il clustering). Se necessario, puoi anche modificare PrivateIpAddress in Pubblico.

#!/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

puoi anche usare jqper analizzare l'output, è una cattiva idea usare awk, grep, o sed, ecc., per analizzare una struttura di nodi, come se fosse una cattiva idea usare espressioni regolari per analizzare 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 può filtrare json tramite l'opzione --query.
ALex_hha,

Non sembra funzionare esattamente allo stesso modo
xenoterracide,

ma sì, è un altro modo per farlo.
xenoterracide,

dai un'occhiata alla mia versione
ALex_hha,

Lo lascerò qui, perché anche se non è la risposta migliore, penso che jqsia uno strumento utile, e lasciarlo qui potrebbe far scoprire a tutti gli operatori, anche se con Amazon puoi fare tutto con il awscomando
xenoterracide

0

Puoi anche consultare l'interfaccia utente della console Web AWS in EC2 -> Gruppi di ridimensionamento automatico -> Scheda Istanze. Vedrai tutte le istanze nell'ASG corrente, puoi quindi fare clic su ciascun ID istanza per ottenere l'IP (ti reindirizzerà a una vista diversa).


Sì, ma voglio l'elenco completo, ho ASG con più di 100 istanze e voglio un elenco di IP per applicare alcune cose.
Ramesh Kumar l'

Di seguito è riportato il piccolo script che ho scritto per ottenere l'elenco IP.
Ramesh Kumar,

in quel caso vorrei usare cli, hai ragione.
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

Ciò restituirà tutte le IP private delle istanze in 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/'))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.