Como obter os endereços IP das instâncias do grupo de escalonamento automático

16

Como posso obter endereços IP privados de todas as instâncias que fazem parte de um grupo AutoScaling. Estou tentando fazer alguma operação em todas as instâncias que fazem parte de um grupo de dimensionamento automático.

Ramesh Kumar
fonte

Respostas:

16

Eu escrevi um pequeno script como abaixo para obter a lista de IPs:

#! / bin / bash
para i no `aws autoscaling descrevem-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
Faz
aws ec2 descreva instâncias --instance-ids $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | cabeça -1 | cut -d "," -f1
feito;
Ramesh Kumar
fonte
votação com todas as minhas mãos
Jameel Grand
downvote porque não é sensato para analisar JSON com grep e awk
xenoterracide
você pode usar jqcomandos para json parse
Perseguição T.
Resposta perfeita, obrigado.
John Humphreys - w00te 12/07/19
10

Como alternativa, minha versão sem 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

Versão mais otimizada

# 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 você precisar de apenas uma lista simples na saída, poderá adicionar outro pipeline

| jq -r '.[]'

ALex_hha
fonte
isso cria muitos "descrevem-instances" pedidos, a mina só cria uma Quero dizer, você poderia fazê-lo apenas para criar twom, mas você tem que parar de usar xargs
xenoterracide
this creates many "describe-instances" requestse? Tanto quanto eu entendi a sua consulta irá trabalhar apenas com as tags não é universal, IMHO
ALex_hha
O seu também não é universal. Na verdade, não posso usar o nome nas minhas consultas. É um nome gerado que faz parte de um sistema automatizado. Ponto é que isso cria um 10 mais 1 solicitações RPC, portanto, ele vai ser lenta dependendo de quantos casos você tem
xenoterracide
Na verdade, o OP não especificou por quais critérios ele precisa fazer uma pesquisa, por isso é uma área cinza :) #
ALex_hha
Sim, eu sei que eu estava apenas sugerindo que você pode fazer as consultas mais eficientes
xenoterracide
1

Semelhante à resposta de Ramesh, aqui está um pequeno e bom script baseado na instância atual e em seu grupo. Certifique-se de definir sua região e, nesse caso, pule a instância atual (usada para cluster). Você também pode alterar PrivateIpAddress para Public, se necessário.

#!/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
7wonders
fonte
1

você também pode usar jqpara analisar a saída; é uma má idéia usar awk, grep ou sed, etc, para analisar uma estrutura de nó, semelhante a uma má idéia usar expressões regulares para analisar 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
xenoterracida
fonte
JFYI: o aws cli alredy pode filtrar o json via --query.
ALD_hha 12/12
Não parece trabalho exatamente da mesma maneira
xenoterracide
mas sim, essa é outra maneira de fazer isso.
Xenoterracide
basta dar uma olhada na minha versão
ALex_hha
Vou deixar isso aqui, porque mesmo se não é a melhor resposta, eu acho que jqé uma ferramenta útil, e deixá-lo aqui pode deixar ops pessoas descobrem que, mesmo com amazon você pode fazer tudo isso com o awscomando
xenoterracide
0

Você também pode procurar na interface do usuário do console da web da AWS em EC2 -> Grupos de dimensionamento automático -> guia Instâncias. Você verá todas as instâncias no ASG atual e poderá clicar no ID de cada instância para obter o IP (ele será redirecionado para uma visualização diferente).

mindblowwn
fonte
Sim, mas quero a lista completa, tenho ASG com mais de 100 instâncias e quero que uma lista de IPs aplique algumas coisas.
Ramesh Kumar
Abaixo está o pequeno script que escrevi para obter a lista de IPs.
Ramesh Kumar
nesse caso, eu usaria cli, você está correto.
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
fonte
0

Isso retornará todos os ips privados de instâncias em um 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
fonte