【Azure Developer】在Azure Resource Graph Explorer中檢視當前訂閱下的所有資源資訊列表並匯出(如VM的名稱,IP地址內網/公網,OS,區域等)

路邊兩盞燈發表於2021-01-28

問題描述

通過Azure的Resource Graph Explorerhttps://portal.azure.cn/#blade/HubsExtension/ArgQueryBlade),可以檢視到當前列表中的各種資源並匯出CSV格式,以便日常的管理或生成Power BI等報表的源資料。

 

如檢視虛擬機器,MySQL,Redis,Application Gateway(應用程式閘道器),VNET(虛擬網路),公共IP等資源資訊。只要找到這些資源的型別(type)後就可以寫類SQL語句(Kusto)。如下:

【Azure Developer】在Azure Resource Graph Explorer中檢視當前訂閱下的所有資源資訊列表並匯出(如VM的名稱,IP地址內網/公網,OS,區域等)

 

查詢語句

上圖中的SQL語句非常的簡單,只是根據型別列出部分資訊。 查詢語句內容:

resources 
| where type in ('microsoft.compute/virtualmachines',
                'microsoft.network/virtualnetworks',
                'microsoft.network/publicipaddresses',
                'microsoft.cache/redis',
                'microsoft.network/applicationGateways',
                'microsoft.dbformysql/servers')
|project  id, name, type, sku
  • where : 指定查詢的過濾條件
  • project :只輸出後面列出的屬性值

而如果需要非常與其他資源的資訊關聯查詢,則需要使用到 leftouter 等。如在問題描述中提到的要檢視VM的內網IP地址和公網IP地址,由於內網IP地址屬於虛擬網路資源的資訊,而公網IP地址也是屬於publicipaddresses的資源資訊,所以需要使用兩次leftouter 來關聯VM資訊查詢。

完整的類SQL語句為:

Resources
| where type =~ 'microsoft.compute/virtualmachines'
|project name, OS=tostring(properties.storageProfile.osDisk.osType), location, 
ipid = tolower(tostring(properties.networkProfile.networkInterfaces[0].id))
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/networkinterfaces'
    | project ipid = tolower(id), elasticPoolName = name, 
    privateIP = properties.ipConfigurations[0].properties.privateIPAddress, 
    publicIPid = properties.ipConfigurations[0].properties.publicIPAddress.id)
on ipid
| project-away ipid
| project name, OS, location, privateIP, pubipid=tolower(tostring(publicIPid))
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/publicipaddresses'
    | project pubipid = tolower(id), publicIP = properties.ipAddress)
on pubipid
| project-away pubipid
| project name, privateIP,publicIP, OS, location

第一次leftouter關聯查詢時候用的是私網IP地址資源的ID作為關聯條件:

  • ipid = tolower(tostring(properties.networkProfile.networkInterfaces[0].id)) 為從VM資源中獲取的私網IP資源ID
  • ipid = tolower(id) 為型別'microsoft.network/networkinterfaces'的資源ID

第二次leftouter關聯查詢時候用的是公網IP地址資源的ID作為關聯條件:

  • publicIPid = properties.ipConfigurations[0].properties.publicIPAddress.id為從第一個leftouter表中獲取到公網IP資源ID, 為了保持與第二個leftouter中的欄位名一致,所以在project中轉換列名pubipid=tolower(tostring(publicIPid))
  • pubipid = tolower(id) 為型別'microsoft.network/networkinterfaces'的資源ID

注:主表資料和leftouter關聯表資料使用的on關鍵字表示關聯條件。

  | project-away pubipid :表示在結果中移除pubipid欄位顯示。詳見:project-away 運算子: https://docs.microsoft.com/zh-cn/azure/data-explorer/kusto/query/projectawayoperator

 

以上查詢語句的結果如圖:

【Azure Developer】在Azure Resource Graph Explorer中檢視當前訂閱下的所有資源資訊列表並匯出(如VM的名稱,IP地址內網/公網,OS,區域等)

 

檢視MySQL資料庫資訊,顯示資料庫服務名,配置和資源所在區域資訊

resources 
| where type =~ 'microsoft.dbformysql/servers'
| project  name, properties, location

檢視Redis資料庫資訊,顯示服務名,配置和資源所在區域資訊

resources 
| where type =~ 'microsoft.cache/redis'
| project  name, properties, location

檢視虛擬網路(VNET)資訊,顯示網路名,配置的內網網段,資源所在區域資訊

resources 
| where type =~ 'microsoft.network/virtualnetworks'
| project  name, addressPrefixes=tostring(properties.addressSpace.addressPrefixes[0]), location

檢視Application Gateway(應用程式閘道器)資訊,顯示服務名稱,配置和資源所在區域資訊

resources 
| where type =~ 'microsoft.network/applicationGateways'
| project  name, properties, location

注:配置資訊從properties中查詢,為JSON資料。可通過物件方式獲取,如properties.addressSpace.addressPrefixes[0]。

 

參考資料

Kusto查詢語句示例https://docs.microsoft.com/zh-cn/azure/data-explorer/kusto/query/samples?pivots=azuredataexplorer

【Azure Developer】在Azure Resource Graph Explorer中檢視當前訂閱下的所有資源資訊列表並匯出(如VM的名稱,IP地址內網/公網,OS,區域等)

 

相關文章