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.

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;

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


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

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

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


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
}

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/'))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.