如何使用Azure CLI列出指定订阅/资源组下VM及配置信息
实现方法
前置准备
先完成Azure CLI登录和目标订阅切换:
# 未登录时先执行登录 az login # 切换到指定名称的目标订阅,替换引号内内容为你的订阅名 az account set --subscription "目标订阅名称"
单命令直接输出层级JSON
执行以下命令可直接输出「订阅-资源组-虚拟机」三级结构的JSON,包含VM规格、操作系统、磁盘配置等需要的字段,无需额外依赖:
az vm list --show-details --query "[].{ resourceGroup: resourceGroup, vmName: name, vmSpecCode: hardwareProfile.vmSize, osType: storageProfile.osDisk.osType, osDisk: { name: storageProfile.osDisk.name, sizeGB: storageProfile.osDisk.diskSizeGB, storageType: storageProfile.osDisk.managedDisk.storageAccountType }, dataDiskCount: length(storageProfile.dataDisks), dataDisks: [storageProfile.dataDisks[] | { name: name, sizeGB: diskSizeGB, storageType: managedDisk.storageAccountType, lun: lun }], runningStatus: powerState } | group_by(@, &resourceGroup) | { subscriptionName: subscription().displayName, subscriptionId: subscription().id, resourceGroups: [].{ resourceGroupName: [0].resourceGroup, virtualMachines: @ } }" -o json
返回字段说明:
vmSpecCode为VM的规格编码(如Standard_D2s_v5),编码和vCPU数、内存大小、临时磁盘配置是固定对应关系,需要对应规格的CPU/内存参数时直接匹配编码即可osType直接返回操作系统类型,取值为Windows或Linux- 磁盘字段包含OS盘和所有数据盘的名称、容量、存储类型
- 如果仅需要查询单个资源组下的VM,在
az vm list后追加-g "资源组名称"参数即可,无需遍历全订阅。
可扩展自定义字段的脚本方案
如果需要额外拉取VM的IP、可用区、网卡配置等更多字段,可以用以下带jq处理的bash脚本,可自由增减查询字段:
#!/bin/bash # 替换为目标订阅名称 TARGET_SUB="目标订阅名称" az account set -s "$TARGET_SUB" # 初始化输出JSON结构 RESULT=$(jq -n \ --arg subName "$(az account show --query name -o tsv)" \ --arg subId "$(az account show --query id -o tsv)" \ '{subscriptionName:$subName, subscriptionId:$subId, resourceGroups:[]}') # 遍历订阅下所有资源组 for rg in $(az group list --query "[].name" -o tsv); do # 拉取当前资源组下所有VM的配置信息,可自行增删query内的字段 vm_data=$(az vm list -g "$rg" --show-details --query "[].{ vmName: name, vmSpecCode: hardwareProfile.vmSize, osType: storageProfile.osDisk.osType, privateIp: privateIps, publicIp: publicIps, osDisk: storageProfile.osDisk | {name:name, sizeGB:diskSizeGB, storageType:managedDisk.storageAccountType}, dataDisks: [storageProfile.dataDisks[] | {name:name, sizeGB:diskSizeGB, storageType:managedDisk.storageAccountType, lun:lun}] }" -o json) # 追加当前资源组数据到结果 RESULT=$(echo "$RESULT" | jq \ --arg rgName "$rg" \ --argjson vmList "$vm_data" \ '.resourceGroups += [{resourceGroupName:$rgName, virtualMachines:$vmList}]') done # 输出格式化后的最终JSON echo "$RESULT" | jq .
注意:运行该脚本需要环境安装jq工具(JSON处理组件),Linux/macOS可通过系统包管理器直接安装,Windows可通过winget安装。
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

