วิธีรับกลุ่มที่อยู่ IP แบบอัตโนมัติ


16

ฉันจะรับที่อยู่ IP ส่วนตัวของทุกอินสแตนซ์ซึ่งเป็นส่วนหนึ่งของกลุ่ม AutoScaling ได้อย่างไร ฉันพยายามที่จะดำเนินการบางอย่างในทุกกรณีซึ่งเป็นส่วนหนึ่งของกลุ่มการหมุนอัตโนมัติ

คำตอบ:


16

ฉันเขียนสคริปต์เล็ก ๆ ด้านล่างเพื่อรับรายการ IP:

#! / bin / ทุบตี
สำหรับ i ใน `aws การปรับอัตโนมัติอธิบาย - auto-scaling-groups - ASGNAME อัตโนมัติปรับขนาดกลุ่ม | grep -i instanceid | awk '{พิมพ์ $ 2}' | cut -d ',' -f1 | sed -e 's / "// g'`
ทำ
aws ec2 อธิบายอินสแตนซ์ --instance-ids $ i | grep -i PrivateIpAddress | awk '{พิมพ์ $ 2}' | หัว -1 | ตัด -d "," -f1
ทำ;

upvoting ด้วยมือทั้งหมดของฉัน
Jameel Grand

downvote เพราะมันไม่ฉลาดที่จะแยกวิเคราะห์ json ด้วย grep และ awk
xenoterracide

คุณสามารถใช้jqคำสั่งเพื่อแจง json
Chase T.

คำตอบที่สมบูรณ์แบบขอบคุณ
John Humphreys - w00te

10

เป็นทางเลือกเวอร์ชันของฉันที่ไม่มี 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

รุ่นที่เหมาะที่สุดเพิ่มเติม

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

หากคุณต้องการเพียงแค่รายการธรรมดาในการส่งออกคุณสามารถเพิ่มไปป์ไลน์อื่น

| jq -r '.[]'


สิ่งนี้สร้างคำขอ "อธิบาย - อินสแตนซ์" จำนวนมากสร้างของฉันเพียงอย่างเดียวที่ฉันหมายถึงคุณสามารถทำให้มันสร้างได้เพียง twom แต่คุณต้องหยุดใช้ xargs
xenoterracide

this creates many "describe-instances" requestsและ? เท่าที่ฉันเข้าใจว่าการค้นหาของคุณจะใช้ได้เฉพาะกับแท็กเท่านั้นไม่ใช่แบบสากล imho
ALex_hha

ของคุณไม่ใช่สากลฉันไม่สามารถใช้ชื่อจริงในแบบสอบถามของฉันเป็นชื่อที่สร้างขึ้นซึ่งเป็นส่วนหนึ่งของระบบอัตโนมัติ ประเด็นคือสิ่งนี้สร้างคำขอ 10 RPC 1 บวกดังนั้นมันจะช้าขึ้นอยู่กับจำนวนอินสแตนซ์ที่คุณมี
xenoterracide

จริงๆแล้ว OP ไม่ได้ระบุตามเกณฑ์ที่เขาต้องการในการค้นหาดังนั้นมันจึงเป็นพื้นที่สีเทา :)
ALex_hha

ใช่ฉันรู้ดังนั้นฉันแค่แนะนำว่าคุณสามารถทำให้การสืบค้นมีประสิทธิภาพมากขึ้น
xenoterracide


1

คล้ายกับคำตอบของ Ramesh ที่นี่เป็นสคริปต์ที่ดีเล็กน้อยโดยอิงจากอินสแตนซ์ปัจจุบันและกลุ่มของมัน ตรวจสอบให้แน่ใจว่าตั้งค่าภูมิภาคของคุณและในกรณีนี้ฉันข้ามอินสแตนซ์ปัจจุบัน (ใช้สำหรับการทำคลัสเตอร์) คุณสามารถเปลี่ยน PrivateIpAddress เป็น Public ได้ถ้าต้องการ

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

คุณยังสามารถใช้jqในการแยกวิเคราะห์ผลลัพธ์มันเป็นความคิดที่ดีที่จะใช้ awk, grep หรือ sed ฯลฯ เพื่อแยกโครงสร้างโหนดคล้ายกับการใช้นิพจน์ทั่วไปเพื่อแยกวิเคราะห์ 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 สามารถกรอง json ผ่านทาง - แบบสอบถามตัวเลือก
ALex_hha

ดูเหมือนจะไม่ทำงานในลักษณะเดียวกัน
xenoterracide

แต่ใช่นั่นเป็นอีกวิธีที่จะทำ
xenoterracide

เพียงแค่ดูที่รุ่นของฉัน
ALex_hha

ฉันจะออกจากที่นี่เพราะแม้ว่ามันจะไม่ใช่คำตอบที่ดีที่สุดฉันคิดว่าjqเป็นเครื่องมือที่มีประโยชน์และการปล่อยไว้ที่นี่อาจทำให้ผู้ใช้ ops ค้นพบมันแม้ว่า amazon คุณสามารถทำได้ทั้งหมดด้วยawsคำสั่ง
xenoterracide

0

คุณยังสามารถดูใน UI คอนโซลเว็บ AWS ใน EC2 -> กลุ่มปรับขนาดอัตโนมัติ -> แท็บอินสแตนซ์ คุณจะเห็นอินสแตนซ์ทั้งหมดภายใต้ ASG ปัจจุบันจากนั้นคุณสามารถคลิกแต่ละอินสแตนซ์ ID เพื่อรับ IP (มันจะเปลี่ยนเส้นทางคุณไปยังมุมมองที่แตกต่างกัน)


ใช่ แต่ฉันต้องการรายการที่สมบูรณ์ฉันมี ASG ที่มีมากกว่า 100 อินสแตนซ์และต้องการรายการของ IP ที่จะใช้บางสิ่ง
Ramesh Kumar

ด้านล่างเป็นสคริปต์ขนาดเล็กที่ฉันเขียนเพื่อรับรายการ IP
Ramesh Kumar

ในกรณีที่ฉันจะใช้ CLI คุณถูกต้อง
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

นี่จะส่งคืนอินสแตนซ์ส่วนตัวทั้งหมดของ 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/'))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.