aws cli ec2 描述实例 table 输出
aws cli ec2 describe-instances table output
我想要 运行 ec2 describe-instances 命令并以 table 格式获得如下输出(其中名称是带有键 'Name' 的标签的值):
----------------------------------------------------------
| DescribeInstances |
+-------------+----------------+--------------+----------+
| instance_id | ip_address | name | state |
+-------------+----------------+--------------+----------+
| i-g93g494d | 99.99.99.01 | name1 | running |
| i-a93f754c | 99.99.99.02 | name2 | running |
+-------------+----------------+--------------+----------+
我可以运行以下命令:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json
并获得输出:
[
[
{
"instance_id": "i-g93g494d",
"state": "running",
"ip_address": "99.99.99.01",
"name": [
"name1"
]
}
],
[
{
"instance_id": "i-a93f754c",
"state": "running",
"ip_address": "99.99.99.02",
"name": [
"name2"
]
}
]
]
但是,当我 运行 使用 --output table 而不是 --output json 相同的命令时,我得到一个错误。
命令:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json
输出:
list index out of range
我希望 table 输出看起来像上面的例子,但我很难解决这个问题。我非常感谢任何人可以提供的任何帮助。
需要使用管道表达式过滤Tag结果,得到第一个值如:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'] | [0].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output table
这里有一个不错的相关博客 post:Get a list of instance with id, name and type
这是一个 python 程序,可用于从 descibe-instances 命令生成列表:
import json
import sys
with open( sys.argv[1] ) as f:
aws = json.load( f )
Reservations = aws['Reservations']
for Reservation in Reservations:
Instances = Reservation['Instances']
for Instance in Instances:
Tags = Instance['Tags']
for Tag in Tags:
if Tag['Key'] == "Name":
print Tag['Value'],Instance['PrivateIpAddress'],Instance['InstanceId'],Instance['State']['Name']
顺便说一句,我非常喜欢 Volkan Paksoy 的回答。那将进入我的绝招。上面的 python 可能有一个优点,可以让您更有效地表达您的搜索条件或以某种方式组合结果。简而言之,就是python,你不用弄明白aws的语法怎么用。
调用上面的 python 脚本的方法如下:
python parse.py <( aws ec2 describe-instances )
当然,您的里程可能会有所不同。例如,您可能没有默认区域,因此您可能需要添加一个额外的参数,如下所示:
python parse.py <( aws ec2 --region us-east-2 describe-instances )
然后您可以将输出稍微操纵为 select 仅 运行 个实例并放入格式正确的列列表:
python parse.py <( aws ec2 --region us-east-2 describe-instances ) | column -t | sort -k1,1 | cat -n | grep running
最后一点,正如我所说的,我是 Volkan 提供的 one liner 的粉丝。我只是想知道如何操作列排序。我发现 aws 按字母顺序对列进行排序。为了使排序更加明显,我在属性名称前放置了数字。但是,这些属性名称没有被正确解释为标识符,所以我不得不用双引号将它们引用起来。这是我最后的结果,请注意细微的引用变化(而不是 'Name' 周围的微妙引用):
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{"01-name": Tags[?Key=='"'Name'"'] | [0].Value, "03-instance_id": InstanceId, "02-ip_address": PrivateIpAddress, "04-state" : State.Name}' --output table
我想要 运行 ec2 describe-instances 命令并以 table 格式获得如下输出(其中名称是带有键 'Name' 的标签的值):
----------------------------------------------------------
| DescribeInstances |
+-------------+----------------+--------------+----------+
| instance_id | ip_address | name | state |
+-------------+----------------+--------------+----------+
| i-g93g494d | 99.99.99.01 | name1 | running |
| i-a93f754c | 99.99.99.02 | name2 | running |
+-------------+----------------+--------------+----------+
我可以运行以下命令:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json
并获得输出:
[
[
{
"instance_id": "i-g93g494d",
"state": "running",
"ip_address": "99.99.99.01",
"name": [
"name1"
]
}
],
[
{
"instance_id": "i-a93f754c",
"state": "running",
"ip_address": "99.99.99.02",
"name": [
"name2"
]
}
]
]
但是,当我 运行 使用 --output table 而不是 --output json 相同的命令时,我得到一个错误。
命令:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json
输出:
list index out of range
我希望 table 输出看起来像上面的例子,但我很难解决这个问题。我非常感谢任何人可以提供的任何帮助。
需要使用管道表达式过滤Tag结果,得到第一个值如:
aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'] | [0].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output table
这里有一个不错的相关博客 post:Get a list of instance with id, name and type
这是一个 python 程序,可用于从 descibe-instances 命令生成列表:
import json
import sys
with open( sys.argv[1] ) as f:
aws = json.load( f )
Reservations = aws['Reservations']
for Reservation in Reservations:
Instances = Reservation['Instances']
for Instance in Instances:
Tags = Instance['Tags']
for Tag in Tags:
if Tag['Key'] == "Name":
print Tag['Value'],Instance['PrivateIpAddress'],Instance['InstanceId'],Instance['State']['Name']
顺便说一句,我非常喜欢 Volkan Paksoy 的回答。那将进入我的绝招。上面的 python 可能有一个优点,可以让您更有效地表达您的搜索条件或以某种方式组合结果。简而言之,就是python,你不用弄明白aws的语法怎么用。
调用上面的 python 脚本的方法如下:
python parse.py <( aws ec2 describe-instances )
当然,您的里程可能会有所不同。例如,您可能没有默认区域,因此您可能需要添加一个额外的参数,如下所示:
python parse.py <( aws ec2 --region us-east-2 describe-instances )
然后您可以将输出稍微操纵为 select 仅 运行 个实例并放入格式正确的列列表:
python parse.py <( aws ec2 --region us-east-2 describe-instances ) | column -t | sort -k1,1 | cat -n | grep running
最后一点,正如我所说的,我是 Volkan 提供的 one liner 的粉丝。我只是想知道如何操作列排序。我发现 aws 按字母顺序对列进行排序。为了使排序更加明显,我在属性名称前放置了数字。但是,这些属性名称没有被正确解释为标识符,所以我不得不用双引号将它们引用起来。这是我最后的结果,请注意细微的引用变化(而不是 'Name' 周围的微妙引用):
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{"01-name": Tags[?Key=='"'Name'"'] | [0].Value, "03-instance_id": InstanceId, "02-ip_address": PrivateIpAddress, "04-state" : State.Name}' --output table