如何通过Azure CLI检查VMSS是否已分配指定用户托管标识?
检查VMSS是否已分配指定用户托管标识的正确方法
问题核心
az vmss identity show返回的userAssignedIdentities是字典结构,键为用户托管标识的完整资源ID,直接用contains或键值访问会因为语法逻辑不对导致失败。以下是两种可靠的检查方法:
方法1:使用Azure CLI内置JMESPath查询
检查指定标识的资源ID是否存在
提取字典的所有键,用contains判断目标资源ID是否在其中:
az vmss identity show --name name-vmss --resource-group rg-name --query "contains(keys(userAssignedIdentities), '/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/你的标识名称')" --output tsv
返回true表示已分配,false表示未分配。
检查指定标识的名称是否存在
如果只知道标识名称,可通过拆分资源ID的最后一段提取名称再检查:
az vmss identity show --name name-vmss --resource-group rg-name --query "contains([for id in keys(userAssignedIdentities): split(id, '/')[-1]], '你的标识名称')" --output tsv
方法2:结合jq工具处理返回结果
若本地安装了jq,可使用更灵活的字典遍历逻辑:
检查资源ID
az vmss identity show --name name-vmss --resource-group rg-name | jq '.userAssignedIdentities | has("你的标识资源ID")'
检查标识名称
az vmss identity show --name name-vmss --resource-group rg-name | jq '.userAssignedIdentities | keys[] | split("/")[-1]' | grep -q "你的标识名称" && echo "已分配" || echo "未分配"
失败原因说明
contains(userAssignedIdentities, "xxx"):contains默认不会遍历字典的键,只会检查字典本身是否包含指定值,因此返回空。- 直接键值访问失败:通常是资源ID拼写错误(比如示例中的
reosurce_id拼写错误),或者未使用完整资源ID作为键。
内容的提问来源于stack exchange,提问作者prakashrajansakthivel
相关产品推荐
相关产品推荐

