![您将如何使用 aws cli 列出特定 VPC 中的实例,并附带标签名称、实例的私有 IP 地址和实例 ID?](https://linux22.com/image/627909/%E6%82%A8%E5%B0%86%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20aws%20cli%20%E5%88%97%E5%87%BA%E7%89%B9%E5%AE%9A%20VPC%20%E4%B8%AD%E7%9A%84%E5%AE%9E%E4%BE%8B%EF%BC%8C%E5%B9%B6%E9%99%84%E5%B8%A6%E6%A0%87%E7%AD%BE%E5%90%8D%E7%A7%B0%E3%80%81%E5%AE%9E%E4%BE%8B%E7%9A%84%E7%A7%81%E6%9C%89%20IP%20%E5%9C%B0%E5%9D%80%E5%92%8C%E5%AE%9E%E4%BE%8B%20ID%EF%BC%9F.png)
我最接近的方法是使用以下命令。
此命令用于列出所有实例的名称。
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
您需要转义反斜杠才能正确格式化答案。
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
答案2
尝试这个
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
答案3
以上答案都可以,但我最喜欢的是;
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”即可
答案4
我添加了一个过滤器,例如状态“正在运行”。将其发布在这里,希望对任何人都有帮助。
我的用例略有不同,我正在生成 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 }'