Як ви могли б перерахувати екземпляри, використовуючи aws cli в певному VPC з ім'ям тегу, приватною IP-адресою екземпляра та ідентифікатором екземпляра?


19

Найближче у мене є використання наступних команд.

Ця команда керує списками всіх назв екземплярів.

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

Цією командою вдається перелічити всі приватні IP-адреси, ідентифікатор екземпляра та ВСІ теги, які мені не потрібні. Мені просто потрібно ім'я.

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

Я не впевнений, чому я не можу виконати команду так:

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

Ця команда працює, але в ній відображаються всі назви ключових тегів.

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

1
Ви просто копіюєте ці команди звідкись, не намагаючись зрозуміти, що вони роблять?
Майкл Хемптон

Насправді я намагався зрозуміти, як використовувати jq і як отримати базовий вихід json, який я хочу. Однак я не зміг знайти прикладів того, чого намагаюся досягти. Використання " NameТегів [? Ключ == ] .Value []" як фільтра для виводу значення ключового імені можливе лише після aws-cli v1.3.0. І я використовую комбінацію --filter та jq, щоб отримати потрібний результат. Найближча команда aws ec2 описує-екземпляри --filters Name = vpc-id, Значення = vpc-e2f17e8b | jq '.Резервації []. Екземпляри [] | {PrivateIpAddress, InstanceId, Tags} 'Мені просто потрібно знати, як посилатися на тег-ключ = Ім'я за допомогою jq.
Imagineer

Відповіді:


24

Вам потрібно уникнути відхилення від косої риски, щоб правильно відформатувати відповідь.

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

І вам не потрібно .Value[]. Ви можете просто використовувати .Value, і це дасть той самий вихід.

Це дивовижно, btw. Я сам це буду реалізовувати!

КОРЕКЦІЯ: Наведене вище не працює, якщо значення .Value"None". Це працює краще:

$ 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

Чи можете ви поясніть свою команду sed? Я отримую ідентифікатори / імена екземплярів одними, що може бути тому, що я не розумію непрямого розширення оболонки в sed.
jorfus

3
Якщо екземпляр не названий (не має тегу: key = набір імен), наступний екземпляр буде надрукований у тому ж рядку. Перша команда sed друкує рядок "None \ n", щоб зменшити цю проблему. Друга команда sed знімає передачу рядка з ідентифікатора екземпляра, так що рядок Tag: key = ім'я друкується в одному рядку.
DrStrangepork

8

Спробуйте це

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

3
Ви повинні включити пояснення свого коду. Опис того, як і чому цей код вирішує проблему, є більш корисним, оскільки допомагає ОП та іншим читачам самостійно вирішувати цю та подібні проблеми.
Ентоні Г - справедливість для Моніки

Це працює, але справді, чому це працює? |це якийсь фільтр?
aairey

7

Вищезгадані відповіді в порядку, але мій улюблений з них - це;

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

насправді, можна розмістити його у списку функцій 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 }

потім просто зателефонуйте з підказки як "awsls"


Як ви додаєте кілька функцій в один файл і просто викликаєте потрібну функцію?
Стрикер

2

Щось на зразок цього?

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

1

Я додав фільтр, наприклад, стан "працює". Опублікуйте його тут, якщо це корисно для когось.

У моєму випадку використання дещо інше, я створюю файли хостів Ansible, тому просто хочу приватне ім’я IP # на всіх запущених хостах.

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

Додаючи це для людей, які знайдуть цю публікацію, коли шукатимуть інформацію про свій примірник. Ви можете додати VPC у операторі select, щоб отримати і це.

У повноцінних оболонках ви можете використовувати:

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

З AWS CLI ви можете використовувати:

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

Я відредагував вашу відповідь, щоб відформатувати команди як команди / код. Чи хотіли б ви ще раз переконатися, що період в кінці вашої першої команди повинен бути там? Якщо ні, будь ласка, відредагуйте це, дякую
JimLohse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.