【问题标题】:aws cli ec2 describe-instances table outputaws cli ec2 describe-instances 表输出
【发布时间】:2015-10-29 11:19:45
【问题描述】:

我想运行一个 ec2 describe-instances 命令并以如下表格格式获取输出(其中名称是带有键“名称”的标签的值):

----------------------------------------------------------
|                    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

我希望表格输出看起来像上面的示例,但我很难解决这个问题。我非常感谢任何人对此提供的任何帮助。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 command-line-interface


    【解决方案1】:

    您需要使用管道表达式过滤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
    

    这里有一篇不错的相关博文:Get a list of instance with id, name and type

    【讨论】:

    • 谢谢!完美运行,这正是我所追求的。我曾尝试使用“name: Tags[?Key=='Name'] | []” 使管道变平,我认为这应该有效(因此提出了问题)但我没有尝试过“name: Tags[?Key== '姓名'] | [0]"
    • 我们可以将这些数据导出到 .csv 中,以便我们可以添加各种过滤器吗?
    【解决方案2】:

    这是一个 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 按字母顺序对列进行排序。为了使排序更明显,我在属性名称前面加上了数字。但是,这些属性名称没有被正确地解释为标识符,所以我不得不用双引号将它们括起来。这是我的结论,请注意微妙的引用变化(而不是围绕“名称”的微妙引用):

    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 
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2016-01-25
      • 2022-06-24
      • 2019-06-14
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多