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

Ima*_*eer 23 aws-cli

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

此命令设法列出所有实例名称。

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'
Run Code Online (Sandbox Code Playgroud)

此命令设法列出所有我不需要的私有 IP 地址、实例 ID 和所有标签。我只需要名字。

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我不能像这样执行命令:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'
Run Code Online (Sandbox Code Playgroud)

此命令有效,但它显示所有标签键名称。

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Run Code Online (Sandbox Code Playgroud)

DrS*_*ork 28

您需要转义反斜杠才能正确格式化答案。

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

所以这是你想要的实际命令:

$ 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
Run Code Online (Sandbox Code Playgroud)

而你不需要.Value[]. 您可以只使用.Value, 这将提供相同的输出。

这太棒了,顺便说一句。我将自己实施!

更正:如果值为.Value“无” ,则上述方法无效。这效果更好:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 如果实例未命名(未设置 Tag:key=Name),则下一个实例将打印在同一行上。第一个 sed 命令打印字符串“None\n”以缓解该问题。第二个 sed 命令从实例 ID 中去除换行符,以便 Tag:key=Name 字符串打印在同一行上。 (3认同)

小智 11

尝试这个

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

  • 您应该包括对代码的解释。描述此代码如何以及为何解决问题更有用,因为它可以帮助 OP 和其他读者自己解决这个问题和类似问题。 (3认同)

小智 8

上面的答案是可以的,但我最喜欢的是;

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
Run Code Online (Sandbox Code Playgroud)

其实可以把它放在一个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 }
Run Code Online (Sandbox Code Playgroud)

然后只需从提示中调用 'awsls'


小智 2

像这样的东西吗?

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