Cara mendapatkan alamat IP Kelompok Autoscaling Instances

16

Bagaimana saya bisa mendapatkan alamat IP pribadi dari semua instance yang merupakan bagian dari grup AutoScaling. Saya mencoba melakukan beberapa operasi pada semua instance yang merupakan bagian dari grup autoscaling.

Ramesh Kumar
sumber

Jawaban:

16

Saya telah menulis skrip kecil seperti di bawah ini untuk mendapatkan daftar IP:

#! / bin / bash
untuk saya di `aws autoscaling mendeskripsikan-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
melakukan
aws ec2 menggambarkan-instance --instance-id $ i | grep -i PrivateIpAddress | awk '{print $ 2}' | kepala -1 | cut -d "," -f1
dilakukan;
Ramesh Kumar
sumber
menang dengan tangan saya
Jameel Grand
downvote karena tidak bijaksana untuk mengurai json dengan grep dan awk
xenoterracide
Anda dapat menggunakan jqperintah untuk mengurai json
Chase T.
Jawaban sempurna, terima kasih.
John Humphreys - w00te
10

Sebagai alternatif, versi saya tanpa 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 yang lebih optimal

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

Jika Anda hanya perlu daftar sederhana dalam output, Anda dapat menambahkan pipa lain

| jq -r '.[]'

ALex_hha
sumber
ini menciptakan banyak permintaan "jelaskan-instance", milik saya hanya membuat satu maksud saya, Anda bisa membuatnya hanya membuat dua, tetapi Anda harus berhenti menggunakan xargs
xenoterracide
this creates many "describe-instances" requestsdan? Sejauh yang saya mengerti permintaan Anda hanya akan berfungsi dengan tag itu tidak universal, imho
ALex_hha
Milikmu bukan Universal, aku juga tidak bisa benar-benar menggunakan nama itu di kueri. Itu nama yang dihasilkan yang merupakan bagian dari sistem otomatis. Intinya adalah ini menciptakan permintaan 10 ditambah 1 RPC oleh karena itu akan lambat tergantung pada berapa banyak contoh yang Anda miliki
xenoterracide
Sebenarnya OP tidak menentukan dengan kriteria apa dia perlu melakukan pencarian, jadi ini adalah area abu-abu :)
ALex_hha
Ya saya tahu jadi saya hanya menyarankan agar Anda dapat membuat kueri lebih efisien
xenoterracide
1

Mirip dengan jawaban Ramesh di sini adalah skrip kecil yang bagus berdasarkan contoh saat ini dan grupnya. Pastikan untuk mengatur wilayah Anda dan dalam hal ini saya melewatkan contoh saat ini (digunakan untuk pengelompokan). Anda juga dapat mengubah PrivateIpAddress menjadi Publik jika diperlukan.

#!/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
7 keajaiban
sumber
1

Anda juga dapat menggunakan jquntuk mem-parsing output, itu ide yang buruk untuk menggunakan awk, grep, atau sed, dll, untuk mem-parsing struktur node, mirip dengan itu menjadi ide yang buruk untuk menggunakan ekspresi reguler ke parse 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
xenoterracide
sumber
JFYI: aws cli alredy dapat memfilter json melalui opsi --query.
ALex_hha
Tampaknya tidak bekerja dengan cara yang persis sama
xenoterracide
tapi ya, itu cara lain untuk melakukannya.
xenoterracide
lihat saja versi saya
ALex_hha
Saya akan meninggalkan ini di sini, karena walaupun itu bukan jawaban terbaik, saya pikir jqini adalah alat yang berguna, dan meninggalkannya di sini mungkin membiarkan orang-orang ops menemukannya, bahkan jika dengan amazon Anda dapat melakukan semuanya dengan awsperintah
xenoterracide
0

Anda juga dapat melihat di konsol web AWS di bawah EC2 -> Grup Penskalaan Otomatis -> Tab Instans. Anda akan melihat semua instance dalam ASG saat ini, Anda kemudian dapat mengklik setiap instance-ID untuk mendapatkan IP (Ini akan mengarahkan Anda ke tampilan yang berbeda.)

mindblowwn
sumber
Ya, Tapi saya ingin daftar lengkap, saya punya ASG dengan lebih dari 100 contoh dan ingin daftar IP untuk menerapkan beberapa hal.
Ramesh Kumar
Di bawah ini adalah skrip kecil yang saya tulis untuk mendapatkan daftar IP.
Ramesh Kumar
dalam hal ini saya akan menggunakan cli, Anda benar.
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
sumber
0

Ini akan mengembalikan semua ips pribadi dari instance dalam 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
sumber