我想运行ec2 describe-instances命令并以表格格式获取输出,如下所示(其中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表而不是--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
我希望表格输出看起来像上面的例子,但我很难解决这个问题。我非常感谢任何人可以提供的任何帮助。
答案 0 :(得分:14)
您需要使用管道表达式来过滤标记结果并获取第一个值,例如:
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
这里有一篇很好的相关博文:Get a list of instance with id, name and type
答案 1 :(得分:1)
这是一个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 )
然后,您可以对输出进行一些操作,以仅选择正在运行的实例并放入格式正确的列列表中:
python parse.py <( aws ec2 --region us-east-2 describe-instances ) | column -t | sort -k1,1 | cat -n | grep running
最后一点,正如我所说,我是Volkan提供的一种衬垫的粉丝。我只是想知道如何可以操纵列排序。我发现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