您将如何在某些VPC中使用aws cli列出实例,并带有标签名称,实例的私有IP地址和实例ID?


19

我得到的最接近的是使用以下命令。

该命令可列出所有实例名称。

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

该命令可以列出所有不需要的私有IP地址,实例ID和所有标签。我只需要名字。

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仅在aws-cli v1.3.0之后,才可以将“ Tags [?Key == ] .Value []”用作关键字名称值的过滤器。我使用--filter和jq的组合来获取所需的输出。最接近的命令是aws ec2 describe-instances --filters名称= vpc-id,值= vpc-e2f17e8b | jq'.Reservations []。Instances [] | {PrivateIpAddress,InstanceId,标签}'我只需要知道如何使用jq引用标签Key = Name。
想象者

Answers:


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,这将提供相同的输出。

棒极了,顺便说一句。我将自己执行此操作!

更正的方法:如果的值为.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命令吗?我将实例ID /名称减一,这可能是因为我不了解sed中的间接shell扩展。
jorfus

3
如果没有命名实例(没有设置Tag:key = Name),则下一个实例将打印在同一行上。第一个sed命令打印字符串“ None \ n”以缓解该问题。第二条sed命令将换行符从instance-id中删除,以便Tag:key = Name字符串被打印在同一行上。
DrStrangepork '16

8

尝试这个

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

3
您应该包括代码说明。描述此代码如何以及为什么可以解决问题更为有用,因为它有助于OP和其他读者自己解决此问题和类似问题。
安东尼·G-莫妮卡(Monica)的

这行得通,但实际上,为什么行得通?|是某种过滤器?
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

为在搜索如何获取您的实例信息时会找到此帖子的人们添加此内容。您也可以在select语句中添加VPC来接收它。

在powershell中,您可以使用:

(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.