使用 Azure CLI 在虚拟机规模集上配置 Azure 资源托管标识

Azure 资源的托管标识是 Microsoft Entra ID 的一项功能。 支持 Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线限制。 在开始之前,请务必查看资源的托管标识的可用性状态以及已知问题

Azure 资源的托管标识在 Microsoft Entra ID 中为 Azure 服务提供了一个自动托管标识。 可以使用此标识向支持 Microsoft Entra 身份验证的任何服务进行身份验证,这样就无需在代码中插入凭据了。

本文介绍如何使用 Azure CLI 在 Azure 虚拟机规模集上执行以下 Azure 资源托管标识操作:

  • 在 Azure 虚拟机规模集上启用和禁用系统分配托管标识
  • 在 Azure 虚拟机规模集上添加和删除用户分配托管标识

如果没有 Azure 帐户,请在继续前注册免费帐户

先决条件

  • 如果你不熟悉 Azure 资源托管标识,请参阅什么是 Azure 资源托管标识?。 若要了解系统分配的托管标识和用户分配的托管标识类型,请参阅托管标识类型

  • 若要执行本文中的管理操作,帐户需要以下基于 Azure 角色的访问控制分配:

    • 虚拟机参与者,可创建虚拟机规模集,并从虚拟机规模集启用和删除系统和/或用户分配托管标识。

    • 托管标识参与者角色,可以创建用户分配的托管标识。

    • 托管标识操作员角色,可在虚拟机规模集中分配和删除用户分配的托管标识。

    注意

    无需其他 Microsoft Entra 目录角色分配。

系统分配的托管标识

本部分介绍如何使用 Azure CLI 为 Azure 虚拟机规模集启用和禁用系统分配托管标识。

在创建 Azure 虚拟机规模集的过程中启用系统分配托管标识

要创建启用了系统分配托管标识的虚拟机规模集,请执行以下操作:

  1. 使用 az group create,创建用于容纳和部署虚拟机规模集及其相关资源的资源组。 如果已有要改用的资源组,则可以跳过此步骤:

    az group create --name myResourceGroup --location westus
    
  2. 创建虚拟机规模集。 以下示例根据 --assign-identity 参数的请求,使用指定的 --role--scope 创建名为 myVMSS 且具有系统分配的托管标识的虚拟机规模集。 --admin-username--admin-password 参数指定用于登录虚拟机的管理用户名和密码帐户。 针对自己的环境相应地更新这些值:

    az vmss create --resource-group myResourceGroup --name myVMSS --image win2016datacenter --upgrade-policy-mode automatic --custom-data cloud-init.txt --admin-username azureuser --admin-password myPassword12 --assign-identity --generate-ssh-keys --role contributor --scope mySubscription
    

在现有 Azure 虚拟机规模集上启用系统分配的托管标识

如果需要在现有 Azure 虚拟机规模集上启用系统分配托管标识,请执行以下操作:

az vmss identity assign -g myResourceGroup -n myVMSS

从 Azure 虚拟机规模集中禁用系统分配托管标识

如果某个虚拟机规模集不再需要系统分配托管标识,但仍需要用户分配托管标识,请使用以下命令:

az vmss update -n myVM -g myResourceGroup --set identity.type='UserAssigned' 

如果某个虚拟机不再需要系统分配托管标识,且没有用户分配托管标识,请使用以下命令:

注意

none 区分大小写。 它必须为小写。

az vmss update -n myVM -g myResourceGroup --set identity.type="none"

用户分配的托管标识

本部分介绍如何使用 Azure CLI 启用和删除用户分配托管标识。

在创建虚拟机规模集的过程中分配用户分配托管标识

本部分介绍如何创建虚拟机规模集以及向虚拟机规模集分配用户分配托管标识。 如果已有要使用的虚拟机规模集,请跳过此部分,转到下一部分。

  1. 如果已有要使用的资源组,可跳过此步骤。 使用 az group create 创建用于包含和部署用户分配托管标识的资源组。 请务必将 <RESOURCE GROUP><LOCATION> 参数值替换为自己的值。 解码的字符:

    az group create --name <RESOURCE GROUP> --location <LOCATION>
    
  2. 使用 az identity create 创建用户分配托管标识。 -g 参数指定要创建用户分配托管标识的资源组,-n 参数指定其名称。 请务必将 <RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 参数值替换为自己的值:

    重要

    创建用户分配的托管标识时,名称必须以字母或数字开头,并且可能包含字母数字字符、连字符 (-) 和下划线 (_) 的组合。 要使虚拟机或虚拟机规模集的分配正常工作,该名称限制为 24 个字符。 有关详细信息,请参阅 FAQ 和已知问题

    az identity create -g <RESOURCE GROUP> -n <USER ASSIGNED IDENTITY NAME>
    

    响应包含所创建的用户分配托管标识的详细信息,与以下示例类似。 下一步会用到分配给用户分配托管标识的资源 id 值。

    {
         "clientId": "73444643-8088-4d70-9532-c3a0fdc190fz",
         "clientSecretUrl": "https://control-westcentralus.identity.azure.net/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>/credentials?tid=5678&oid=9012&aid=73444643-8088-4d70-9532-c3a0fdc190fz",
         "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
         "location": "westcentralus",
         "name": "<USER ASSIGNED IDENTITY NAME>",
         "principalId": "e5fdfdc1-ed84-4d48-8551-fe9fb9dedfll",
         "resourceGroup": "<RESOURCE GROUP>",
         "tags": {},
         "tenantId": "733a8f0e-ec41-4e69-8ad8-971fc4b533bl",
         "type": "Microsoft.ManagedIdentity/userAssignedIdentities"    
    }
    
  3. 创建虚拟机规模集。 以下示例根据 --assign-identity 参数的指定,使用指定的 --role--scope 创建与新用户分配的托管标识关联的虚拟机规模集。 请务必将 <RESOURCE GROUP><VMSS NAME><USER NAME><PASSWORD><USER ASSIGNED IDENTITY><ROLE><SUBSCRIPTION> 参数值替换为自己的值。

    az vmss create --resource-group <RESOURCE GROUP> --name <VMSS NAME> --image <SKU Linux Image> --admin-username <USER NAME> --admin-password <PASSWORD> --assign-identity <USER ASSIGNED IDENTITY> --role <ROLE> --scope <SUBSCRIPTION>
    

将用户分配托管标识分配到现有虚拟机规模集

  1. 使用 az identity create 创建用户分配托管标识。 -g 参数指定要创建用户分配托管标识的资源组,-n 参数指定其名称。 请务必将 <RESOURCE GROUP><USER ASSIGNED IDENTITY NAME> 参数值替换为自己的值:

    az identity create -g <RESOURCE GROUP> -n <USER ASSIGNED IDENTITY NAME>
    

    响应包含所创建的用户分配托管标识的详细信息,与以下示例类似。

    {
         "clientId": "73444643-8088-4d70-9532-c3a0fdc190fz",
         "clientSecretUrl": "https://control-westcentralus.identity.azure.net/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY >/credentials?tid=5678&oid=9012&aid=73444643-8088-4d70-9532-c3a0fdc190fz",
         "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY>",
         "location": "westcentralus",
         "name": "<USER ASSIGNED IDENTITY>",
         "principalId": "e5fdfdc1-ed84-4d48-8551-fe9fb9dedfll",
         "resourceGroup": "<RESOURCE GROUP>",
         "tags": {},
         "tenantId": "733a8f0e-ec41-4e69-8ad8-971fc4b533bl",
         "type": "Microsoft.ManagedIdentity/userAssignedIdentities"    
    }
    
  2. 将用户分配的托管标识分配给虚拟机规模集。 请务必将 <RESOURCE GROUP><VIRTUAL MACHINE SCALE SET NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY> 为上一步创建的用户分配标识的资源 name 属性:

    az vmss identity assign -g <RESOURCE GROUP> -n <VIRTUAL MACHINE SCALE SET NAME> --identities <USER ASSIGNED IDENTITY>
    

从 Azure 虚拟机规模集删除用户分配的托管标识

若要从虚拟机规模集中删除用户分配的托管标识,请使用 az vmss identity remove。 如果这是用户分配给虚拟机规模集的唯一托管标识,则将从标识类型值中删除 UserAssigned。 请务必将 <RESOURCE GROUP><VIRTUAL MACHINE SCALE SET NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY> 为用户分配托管标识的 name 属性,可通过 az vmss identity show 在虚拟机规模集的标识部分中找到:

az vmss identity remove -g <RESOURCE GROUP> -n <VIRTUAL MACHINE SCALE SET NAME> --identities <USER ASSIGNED IDENTITY>

如果虚拟机规模集没有系统分配的托管标识,并且你想要从中删除所有用户分配的托管标识,请使用以下命令:

注意

none 区分大小写。 它必须为小写。

az vmss update -n myVMSS -g myResourceGroup --set identity.type="none" identity.userAssignedIdentities=null

如果虚拟机规模集同时具有系统分配托管标识和用户分配托管标识,则可通过切换为仅使用系统分配托管标识,删除所有用户分配标识。 请使用以下命令:

az vmss update -n myVMSS -g myResourceGroup --set identity.type='SystemAssigned' identity.userAssignedIdentities=null 

后续步骤