Làm thế nào bạn có thể liệt kê các trường hợp sử dụng aws cli trong một VPC nhất định với Tên thẻ, địa chỉ IP riêng của cá thể và id cá thể?


19

Gần nhất tôi có được là sử dụng các lệnh sau.

Lệnh này quản lý để liệt kê tất cả tên của các trường hợp.

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

Lệnh này quản lý để liệt kê tất cả địa chỉ IP riêng, id cá thể và TẤT CẢ các thẻ mà tôi không cần. Tôi chỉ cần tên.

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

Tôi không chắc tại sao tôi không thể thực thi lệnh như thế này:

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

Lệnh này hoạt động nhưng nó hiển thị tất cả các tên Thẻ khóa.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'

1
Bạn chỉ đang sao chép các lệnh này từ đâu đó mà không cố gắng hiểu chúng làm gì?
Michael Hampton

Không thực sự, tôi đã cố gắng hiểu cách sử dụng jq và làm thế nào để có được đầu ra json cơ bản mà tôi muốn. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào cho những gì tôi đang cố gắng đạt được. Sử dụng "Thẻ [? Key == Name] .Value []" làm bộ lọc cho Tên khóa Giá trị đầu ra chỉ có thể có sau aws-cli v1.3.0. Và tôi đang sử dụng kết hợp --filter và jq để có được đầu ra mà tôi muốn. Lệnh gần nhất là aws ec2 description-instance --filters Name = vpc-id, Values ​​= vpc-e2f17e8b | jq '.Reservations []. Trường hợp [] | {PrivateIpAddress, InstanceId, Tags} 'Tôi chỉ cần biết cách tham chiếu Khóa thẻ = Tên bằng jq.
Tưởng tượng

Câu trả lời:


24

Bạn cần thoát dấu gạch chéo ngược để định dạng câu trả lời chính xác.

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

Vì vậy, đây là lệnh thực tế bạn muốn:

$ 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

Và bạn không cần .Value[]. Bạn chỉ có thể sử dụng .Value, và điều đó sẽ cho cùng một đầu ra.

Điều này thật tuyệt vời, btw. Tôi sẽ tự thực hiện điều này!

ĐÚNG: Ở trên sẽ không hoạt động nếu giá trị .Valuelà "Không". Điều này hoạt động tốt hơn:

$ 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

Bạn có thể vui lòng giải thích lệnh sed của bạn? Tôi nhận được một ID / tên cá thể bị tắt bởi một cái có thể là do tôi không hiểu sự mở rộng vỏ gián tiếp trong sed.
jorfus

3
Nếu một phiên bản không được đặt tên (không có Thẻ: key = Tên bộ), thì phiên bản tiếp theo sẽ được in trên cùng một dòng. Lệnh sed đầu tiên in chuỗi "Không \ n" để giảm thiểu vấn đề đó. Lệnh sed thứ hai loại bỏ nguồn cấp dữ liệu ra khỏi id-id, sao cho thẻ Tag: key = Chuỗi tên được in trên cùng một dòng.
DrStrangepork

8

Thử đi

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t

3
Bạn nên bao gồm giải thích cho mã của bạn. Mô tả cách thức và lý do tại sao mã này giải quyết vấn đề hữu ích hơn vì nó giúp OP và các độc giả khác tự giải quyết vấn đề này và các vấn đề tương tự.
Anthony G - công lý cho Monica

Điều này hoạt động, nhưng thực sự, tại sao nó hoạt động? |là một số loại bộ lọc?
aairey

7

Các câu trả lời trên là OK, nhưng yêu thích của tôi là như vậy;

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

trong thực tế, người ta có thể đặt nó trong danh sách danh sách chức năng 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 }

sau đó chỉ cần gọi từ dấu nhắc là 'awsls'


Làm thế nào để bạn thêm nhiều chức năng trong một tập tin và chỉ cần gọi chức năng bạn muốn?
Stryker

2

Một cái gì đó như thế này?

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

1

Tôi đã thêm một bộ lọc cho trạng thái "đang chạy". Đăng nó ở đây trong trường hợp đó là hữu ích cho bất cứ ai.

Trường hợp sử dụng của tôi hơi khác một chút, tôi đang tạo các tệp máy chủ Ansible vì vậy tôi chỉ muốn tên IP # riêng trên tất cả các máy chủ đang chạy.

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 }'

0

Thêm phần này cho những người sẽ tìm thấy bài đăng này khi tìm kiếm cách lấy thông tin cá thể của bạn. Bạn có thể thêm VPC trong câu lệnh select để nhận điều đó.

Trong powershell bạn có thể sử dụng:

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

Với AWS CLI, bạn có thể sử dụng:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName

Tôi đã chỉnh sửa câu trả lời của bạn để định dạng các lệnh dưới dạng lệnh / mã. Bạn có vui lòng kiểm tra kỹ xem khoảng thời gian ở cuối lệnh đầu tiên của bạn có cần không? Nếu không, vui lòng chỉnh sửa nó, cảm ơn
JimLohse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.