問題描述
通過Azure的Resource Graph Explorer(https://portal.azure.cn/#blade/HubsExtension/ArgQueryBlade),可以檢視到當前列表中的各種資源並匯出CSV格式,以便日常的管理或生成Power BI等報表的源資料。
如檢視虛擬機器,MySQL,Redis,Application Gateway(應用程式閘道器),VNET(虛擬網路),公共IP等資源資訊。只要找到這些資源的型別(type)後就可以寫類SQL語句(Kusto)。如下:
查詢語句
上圖中的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
以上查詢語句的結果如圖:
檢視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