Bagaimana Anda akan mendaftar instance menggunakan aws cli di VPC tertentu dengan Nama Tag, alamat IP pribadi instance dan id instance?

19

Yang paling dekat yang saya dapatkan adalah menggunakan perintah berikut.

Perintah ini mengatur daftar semua nama instance.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

Perintah ini mengatur untuk mencantumkan semua alamat ip pribadi, contoh id dan SEMUA tag yang tidak saya butuhkan. Saya hanya perlu namanya.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

Saya tidak yakin mengapa saya tidak bisa menjalankan perintah seperti ini:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

Perintah ini berfungsi tetapi menunjukkan semua nama Tag Key.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Imagineer
sumber
1
Apakah Anda hanya menyalin perintah ini dari suatu tempat tanpa mencoba memahami apa yang mereka lakukan?
Michael Hampton
Tidak juga, saya memang mencoba memahami bagaimana menggunakan jq dan bagaimana mendapatkan output json dasar yang saya inginkan. Namun, saya tidak dapat menemukan contoh apa pun yang ingin saya capai. Menggunakan "Tag [? Key == Name] .Value []" sebagai filter untuk Nama Kunci, output Nilai hanya mungkin setelah aws-cli v1.3.0. Dan saya menggunakan kombinasi --filter dan jq untuk mendapatkan output yang saya inginkan. Perintah terdekat adalah aws ec2 menggambarkan-contoh --filters Name = vpc-id, Nilai = vpc-e2f17e8b | jq '.Revervations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} 'Saya hanya perlu tahu bagaimana mereferensikan Tag Key = Nama menggunakan jq.
Imagineer

Jawaban:

24

Anda harus melarikan diri dari garis miring terbalik untuk memformat jawaban dengan benar.

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

Jadi ini adalah perintah aktual yang Anda inginkan:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

Dan kamu tidak perlu .Value[]. Anda bisa menggunakan .Value, dan itu akan memberikan hasil yang sama.

Ini luar biasa, btw. Saya akan menerapkan ini sendiri!

KOREKSI: Di atas tidak akan berfungsi jika nilai .Value"Tidak". Ini bekerja lebih baik:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3
DrStrangepork
sumber
Bisakah Anda jelaskan perintah sed Anda? Saya mendapatkan ID / nama instan dari salah satu yang mungkin karena saya tidak memahami ekspansi shell tidak langsung di sed.
jorfus
3
Jika sebuah instance tidak bernama (tidak memiliki Tag: key = Name set), maka instance berikutnya akan dicetak pada baris yang sama. Perintah sed pertama mencetak string "None \ n" untuk mengurangi masalah itu. Perintah sed kedua menghapus linefeed dari instance-id, sehingga Tag: key = String nama akan dicetak pada baris yang sama.
DrStrangepork
8

Coba ini

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
alf-man
sumber
3
Anda harus memasukkan penjelasan untuk kode Anda. Menjelaskan bagaimana dan mengapa kode ini memecahkan masalah lebih berguna karena membantu OP dan pembaca lain memecahkan masalah ini dan masalah serupa itu sendiri.
Anthony G - keadilan untuk Monica
Ini bekerja, tetapi memang, mengapa itu bekerja? |apakah ada semacam filter?
aairey
7

Jawaban di atas tidak apa-apa, tetapi favorit saya adalah;

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

pada kenyataannya, seseorang dapat menempatkannya dalam daftar daftar fungsi BASH;

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

kemudian cukup panggil dari prompt sebagai 'awsls'

Jorge de la Torre
sumber
Bagaimana Anda menambahkan beberapa fungsi dalam satu file dan cukup memanggil fungsi yang Anda inginkan?
Stryker
2

Sesuatu seperti ini?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
Alan
sumber
1

Saya menambahkan filter misalnya keadaan "berjalan". Posting di sini jika itu bermanfaat bagi siapa pun.

Kasus penggunaan saya sedikit berbeda, saya menghasilkan file host Ansible jadi saya hanya ingin nama IP pribadi di semua host yang berjalan.

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'
jorfus
sumber
0

Menambahkan ini untuk orang-orang yang akan menemukan posting ini ketika mencari cara untuk mendapatkan informasi contoh Anda. Anda dapat menambahkan VPC dalam pernyataan pilih untuk menerimanya juga.

Di PowerShell, Anda dapat menggunakan:

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

Dengan AWS CLI Anda dapat menggunakan:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName
Jose Adams
sumber
Saya mengedit jawaban Anda untuk memformat perintah sebagai perintah / kode. Apakah Anda ingin memeriksa ulang bahwa periode di akhir perintah pertama Anda perlu ada di sana? Jika tidak, harap edit, terima kasih
JimLohse