Cómo obtener direcciones de IP de instancias de grupo de escalado automático


16

¿Cómo puedo obtener direcciones IP privadas de todas las instancias que forman parte de un grupo de AutoScaling? Estoy tratando de hacer alguna operación en todas las instancias que forman parte de un grupo de autoescalado.

Respuestas:


16

He escrito un pequeño script como el siguiente para obtener la lista de IP:

#! / bin / bash
para i en `aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cortar -d ',' -f1 | sed -e 's / "// g'`
hacer
aws ec2 describe-instancias --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | cabeza -1 | cortar -d "," -f1
hecho;

votación con todas mis manos
Jameel Grand

voto negativo porque no es prudente analizar json con grep y awk
xenoterracide

puede usar el jqcomando para analizar json
Chase T.

Respuesta perfecta, gracias.
John Humphreys - w00te

10

Como alternativa, mi versión sin 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

Versión más optimizada

# 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 solo necesita una lista simple en la salida, puede agregar otra tubería

| jq -r '.[]'


esto crea muchas solicitudes de "describir instancias", la mía solo crea una, quiero decir, podrías hacer que solo creara dos, pero tendrías que dejar de usar
xargs

this creates many "describe-instances" requests¿y? Según tengo entendido, su consulta solo funcionará con etiquetas que no son universales, en mi humilde opinión
ALex_hha

El tuyo no es universal tampoco puedo usar el nombre en mis consultas, es un nombre generado que forma parte de un sistema automatizado. Punto es que esto crea unas 10 más 1 peticiones RPC, por tanto, será lento dependiendo del número de casos que tiene
xenoterracide

En realidad, OP no especificó por qué criterios necesita hacer una búsqueda, por lo que es un área gris :)
ALex_hha

Sí, lo sé, así que solo estaba sugiriendo que puede hacer que las consultas sean más eficientes
xenoterracide


1

Similar a la respuesta de Ramesh aquí hay un pequeño guión agradable basado en la instancia actual y su grupo. Asegúrese de establecer su región y en este caso omito la instancia actual (utilizada para la agrupación en clúster). También puede cambiar PrivateIpAddress a Public si es necesario.

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

también puede usar jqpara analizar la salida, es una mala idea usar awk, grep o sed, etc., para analizar una estructura de nodo, similar a que sea una mala idea usar expresiones regulares para analizar 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 puede filtrar json mediante la opción --query.
ALex_hha

No parece funcionar exactamente de la misma manera
xenoterracide

pero sí, esa es otra forma de hacerlo.
xenoterracide

solo eche un vistazo a mi versión
ALex_hha

Voy a dejar esto aquí, porque incluso si no es la mejor respuesta, creo que jqes una herramienta útil, y dejarlo aquí puede permitir que las personas lo descubran, incluso si con Amazon puedes hacerlo todo con el awscomando
xenoterracide

0

También puede buscar en la interfaz de usuario de la consola web de AWS en EC2 -> Grupos de escalado automático -> Pestaña Instancias. Verá todas las instancias bajo ASG actual, luego puede hacer clic en cada ID de instancia para obtener la IP (lo redirigirá a una vista diferente).


Sí, pero quiero la lista completa, tengo ASG con más de 100 instancias y quiero una lista de IP para aplicar algunas cosas.
Ramesh Kumar

A continuación se muestra el pequeño script que escribí para obtener la lista de IP.
Ramesh Kumar

en ese caso usaría cli, estás en lo correcto.
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

Esto devolverá todos los ips privados de instancias en 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/'))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.