查询启用CustomScript扩展Azure VM及属性的KQL方案
问题描述
需求为统计启用CustomScript扩展的虚拟机总数、对应虚拟机清单,并获取该扩展的properties属性信息。以下原有KQL查询存在逻辑问题,无法正确提取CustomScript扩展相关数据:
Resources | where type == 'microsoft.compute/virtualmachines' | extend JoinID = toupper(id), OSName = tostring(properties.osProfile.computerName), OSType = tostring(properties.storageProfile.osDisk.osType), VMSize = tostring(properties.hardwareProfile.vmSize) | join kind=leftouter( Resources | where type == 'microsoft.compute/virtualmachines/extensions' | extend VMId = toupper(substring(id, 0, indexof(id, '/extensions'))), ExtensionName =~ 'custom-script' ) on $left.JoinID == $right.VMId | top 5 by name asc
可用KQL实现方案
输出启用CustomScript扩展的虚拟机清单+扩展属性
Resources // 先筛选所有虚拟机扩展资源 | where type == 'microsoft.compute/virtualmachines/extensions' // 精准匹配CustomScript扩展,兼容Windows/Linux不同命名规则 | where properties.type =~ 'CustomScript' or name contains 'CustomScript' | extend VMId = toupper(substring(id, 0, indexof(id, '/extensions'))), ExtensionName = name, ExtensionProvisioningState = tostring(properties.provisioningState), ExtensionProperties = properties // 关联虚拟机基础属性 | join kind=inner ( Resources | where type == 'microsoft.compute/virtualmachines' | extend VMJoinId = toupper(id), VMName = name, VMResourceGroup = resourceGroup, VMLocation = location, OSComputerName = tostring(properties.osProfile.computerName), OSType = tostring(properties.storageProfile.osDisk.osType), VMSize = tostring(properties.hardwareProfile.vmSize) ) on $left.VMId == $right.VMJoinId // 清理关联产生的冗余字段,整理输出列 | project VMName, VMResourceGroup, VMLocation, OSComputerName, OSType, VMSize, ExtensionName, ExtensionProvisioningState, ExtensionProperties | sort by VMName asc
统计启用CustomScript扩展的虚拟机总数
如果只需要统计数量,可以在上述查询的基础上追加聚合语句,替换最后两行即可:
| summarize CustomScriptVMCount = dcount(VMId)
原查询的错误点
- 筛选逻辑错误:
ExtensionName =~ 'custom-script'写在extend子句中,仅做字段赋值没有加where过滤条件,会返回虚拟机下所有类型的扩展 - 匹配规则错误:CustomScript扩展在不同OS下的名称不固定,硬匹配
custom-script字符串会漏统计 - 关联方式错误:使用
leftouter左关联会返回所有虚拟机,包括未安装目标扩展的实例,不符合筛选要求 - 输出逻辑错误:没有指定输出字段,冗余字段过多,也没有单独提取扩展的properties属性
注意:如果需要同时返回总数和清单,可以使用
summarize结合make_list函数聚合,示例:| summarize TotalCount = dcount(VMId), VMList = make_list(VMName)
内容的提问来源于stack exchange,提问作者user1396982
相关产品推荐
相关产品推荐

