簡體   English   中英

解析AWS EC2 describe-instances以獲取所有私有IP地址

[英]Parsing aws ec2 describe-instances to get all private ip addresses

我的兩個EC2實例每個都有3個IP。 我設法成功地獲取了JSON對象的列表:

aws ec2 describe-instances | jq '.Reservations[] | .Instances[] | (.Tags | { "iname": ( map ( select(.Value | contains("my-vm")))[] | .Value ) } ) + ( { "ip": ( .NetworkInterfaces[].PrivateIpAddress) } )' | jq -s .

給我以下結果:

[
  {
    "iname": "my-vm-b",
    "ip": "10.11.2.145"
  },
  {
    "iname": "my-vm-b",
    "ip": "10.11.1.146"
  },
  {
    "iname": "my-vm-b",
    "ip": "10.11.10.144"
  },
  {
    "iname": "my-vm-a",
    "ip": "10.11.1.9"
  },
  {
    "iname": "my-vm-a",
    "ip": "10.11.10.125"
  },
  {
    "iname": "my-vm-a",
    "ip": "10.11.2.85"
  }
]

然后將以下內容添加到命令中:

... | jq ' group_by(.iname)[] | {(.[0].iname): [.[] | .ip]}' | jq -s .

最終以我想要的方式獲取對象列表:

[
  {
    "my-vm-a": [
      "10.11.1.9",
      "10.11.10.125",
      "10.11.2.85"
    ]
  },
  {
    "my-vm-b": [
      "10.11.2.145",
      "10.11.1.146",
      "10.11.10.144"
    ]
  }
]

注意,我不得不給jq打電話了4次。 我知道我一定做錯了,所以我想知道是否可以通過一個jq調用來完成。

謝謝!

通過將表達式適當地包裝在方括號中,或者使用map可能更好,可以輕松消除對jq -s的調用。

例如,您的最后一對jq調用可以簡化為:

jq 'group_by(.iname) | map({(.[0].iname): [.[] | .ip]})'

下面應該使您可以將四個調用減少為一個:

[.Reservations[]
 | .Instances[]
 | (.Tags | { "iname": ( map ( select(.Value | contains("my-vm")))[] | .Value ) } )
    + ( { "ip": ( .NetworkInterfaces[].PrivateIpAddress) } ) ]
| group_by(.iname) | map({(.[0].iname): [.[] | .ip]})

但是,我建議不要在這里使用contains ,除非您完全了解其復雜性。

在您嘗試簡化jq調用之前,我認為先查看源數據及其與所需結果的關系會更有益。

忽略數據中的許多其他細節,我想我們可以同意您的數據看起來像這樣:

{
    "Reservations": [
        {
            "Instances": [
                {
                    "NetworkInterfaces": [
                        { "PrivateIpAddress": "10.11.2.145" },
                        { "PrivateIpAddress": "10.11.1.146" },
                        { "PrivateIpAddress": "10.11.10.144" }
                    ],
                    "Tags": [
                        { "Key": "Name", "Value": "my-vm-b" }
                    ]
                },
                {
                    "NetworkInterfaces": [
                        { "PrivateIpAddress": "10.11.1.9" },
                        { "PrivateIpAddress": "10.11.10.125" },
                        { "PrivateIpAddress": "10.11.2.85" }
                    ],
                    "Tags": [
                        { "Key": "Name", "Value": "my-vm-a" }
                    ]
                }
            ]
        }
    ]
}

使用如下所示的內容,您的jq查詢可以簡單地是:

[.Reservations[].Instances[] |
    {
        (.Tags|from_entries.Name): [.NetworkInterfaces[].PrivateIpAddress]
    }
]

無需中間結果。 這里只是一些注意事項。

  • 標簽已經是鍵/值對的數組,您可以輕松地從此處讀取值,首先使用from_entries將它們轉換為對象
  • 您正在基於包含"my-vm"的標記值的存在來選擇實例。 我不確定您是否甚至需要執行此操作,我不知道您的數據是什么樣子,但是它們可能采用固定名稱,因此您應該使用該名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM