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

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

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

有关 Azure Policy 定义和详细信息的信息,请参阅使用 Azure Policy 分配托管标识(预览版)

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

  • 如果不熟悉 Azure 资源的托管标识,请查阅概述部分

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

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

    注意

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

    • 虚拟机参与者,可从虚拟机规模集启用和删除系统分配的托管标识。

系统分配的托管标识

在本部分中,将学习如何使用 Azure 门户启用和禁用系统分配的托管标识。

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

当前,Azure 门户不支持在创建虚拟机规模集期间启用系统分配的托管标识。 请改为参考以下虚拟机规模集创建快速入门文章来首先创建虚拟机规模集,然后,转到下一部分来了解有关在虚拟机规模集上启用系统分配的托管标识的详细信息:

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

提示

本文中的步骤可能因开始使用的门户而略有不同。

若要在初始预配时没有启用系统分配的托管标识的虚拟机规模集上启用系统分配的托管标识,请执行以下操作:

  1. 使用与包含虚拟机规模集的 Azure 订阅关联的帐户登录 Azure 门户

  2. 导航到所需的虚拟机规模集。

  3. 在“系统分配”、“状态”下,选择“开启”,然后单击“保存”

    屏幕截图显示“标识(预览版)”页,其中“系统分配”处于选中状态,“状态”为“打开”,并且突出显示了“保存”按钮。

从虚拟机规模集中删除系统分配的托管标识

如果虚拟机规模集不再需要系统分配托管标识,请执行以下操作:

  1. 使用与包含虚拟机规模集的 Azure 订阅关联的帐户登录 Azure 门户。 此外,请确保该帐户属于可授予对虚拟机规模集的写权限的角色。

  2. 导航到所需的虚拟机规模集。

  3. 在“系统分配”、“状态”下,选择“关闭”,然后单击“保存”

    显示配置页的屏幕截图。

用户分配的托管标识

在本部分中,你将学习如何使用 Azure 门户从虚拟机规模集中添加和删除用户分配的托管标识。

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

当前,Azure 门户不支持在创建虚拟机规模集期间分配用户分配的托管标识。 请改为参考以下虚拟机规模集创建快速入门文章来首先创建虚拟机规模集,然后,转到下一部分来了解有关为其分配用户分配的托管标识的详细信息:

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

  1. 使用与包含虚拟机规模集的 Azure 订阅关联的帐户登录 Azure 门户

  2. 导航到所需的虚拟机规模集,依次单击“标识”、“用户分配”和“+添加”

    显示将用户分配的标识添加到虚拟机规模集的屏幕截图。

  3. 单击要添加到虚拟机规模集的用户分配的托管标识,然后单击“添加”

    显示如何将用户分配的标识添加到虚拟机规模集的屏幕截图。

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

  1. 使用已与包含 VM 的 Azure 订阅关联的帐户登录 Azure 门户

  2. 导航到所需的虚拟机规模集,然后依次单击“标识”、“用户分配”、要删除的用户分配的托管标识,然后单击“删除”(在确认窗格中单击“是”)。

    显示如何从虚拟机规模集中移除用户分配标识的屏幕截图。

后续步骤

本文介绍如何使用 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": "00001111-aaaa-2222-bbbb-3333cccc4444",
         "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=00001111-aaaa-2222-bbbb-3333cccc4444",
         "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>",
         "location": "westcentralus",
         "name": "<USER ASSIGNED IDENTITY NAME>",
         "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
         "resourceGroup": "<RESOURCE GROUP>",
         "tags": {},
         "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
         "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": "00001111-aaaa-2222-bbbb-3333cccc4444",
         "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=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
         "id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY>",
         "location": "westcentralus",
         "name": "<USER ASSIGNED IDENTITY>",
         "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
         "resourceGroup": "<RESOURCE GROUP>",
         "tags": {},
         "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
         "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 

后续步骤

在本文中,你将了解如何使用 PowerShell 在虚拟机规模集上执行 Azure 资源的托管标识操作:

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

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

先决条件

系统分配的托管标识

在此部分中,将了解如何使用 Azure PowerShell 启用和删除系统分配的托管标识。

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

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

  1. 请参阅 New-AzVmssConfig cmdlet 参考文章中的示例 1,以创建具有系统分配的托管标识的虚拟机规模集。 将参数 -IdentityType SystemAssigned 添加到 New-AzVmssConfig cmdlet:

    $VMSS = New-AzVmssConfig -Location $Loc -SkuCapacity 2 -SkuName "Standard_A0" -UpgradePolicyMode "Automatic" -NetworkInterfaceConfiguration $NetCfg -IdentityType SystemAssigned`
    

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

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

  1. 请确保你使用的 Azure 帐户所属角色可授予对虚拟机规模集的写入权限,如“虚拟机参与者”。

  2. 使用 Get-AzVmss cmdlet 检索虚拟机规模集属性。 然后,若要启用系统分配的托管标识,请在 Update-AzVmss cmdlet 上使用 -IdentityType 开关:

    Update-AzVmss -ResourceGroupName myResourceGroup -Name -myVmss -IdentityType "SystemAssigned"
    

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

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

  1. 请确保该帐户所属角色可授予对虚拟机规模集的写入权限,如“虚拟机参与者”。

  2. 运行以下 cmdlet:

    Update-AzVmss -ResourceGroupName myResourceGroup -Name myVmss -IdentityType "UserAssigned"
    
  3. 如果某个虚拟机规模集不再需要系统分配的托管标识,且没有用户分配的托管标识,请使用以下命令:

    Update-AzVmss -ResourceGroupName myResourceGroup -Name myVmss -IdentityType None
    

用户分配的托管标识

本部分介绍如何使用 Azure PowerShell 从虚拟机规模集中添加和删除用户分配的托管标识。

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

目前不支持通过 PowerShell 创建具有用户分配的托管标识的新虚拟机规模集。 有关如何将用户分配的托管标识添加到现有虚拟机规模集的信息,请参阅下一部分。 请关注后续更新。

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

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

  1. 请确保该帐户所属角色可授予对虚拟机规模集的写入权限,如“虚拟机参与者”。

  2. 使用 Get-AzVM cmdlet 检索虚拟机规模集属性。 然后,若要向虚拟机规模集分配用户分配的托管标识,请在 Update-AzVmss cmdlet 上使用 -IdentityType-IdentityID 开关。 将 <VM NAME><SUBSCRIPTION ID><RESROURCE GROUP><USER ASSIGNED ID1>USER ASSIGNED ID2 替换为自己的值。

    重要

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

    Update-AzVmss -ResourceGroupName <RESOURCE GROUP> -Name <VMSS NAME> -IdentityType UserAssigned -IdentityID "<USER ASSIGNED ID1>","<USER ASSIGNED ID2>"
    

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

如果虚拟机规模集有多个用户分配的托管标识,则可以使用以下命令将这些标识删除到只剩一个。 请务必将 <RESOURCE GROUP><VIRTUAL MACHINE SCALE SET NAME> 参数值替换为自己的值。 <USER ASSIGNED IDENTITY NAME> 是用户分配的托管标识的名称属性,该属性应保留在虚拟机规模集上。 可通过 az vmss show 在虚拟机规模集的标识部分中找到此信息:

Update-AzVmss -ResourceGroupName myResourceGroup -Name myVmss -IdentityType UserAssigned -IdentityID "<USER ASSIGNED IDENTITY NAME>"

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

Update-AzVmss -ResourceGroupName myResourceGroup -Name myVmss -IdentityType None

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

Update-AzVmss -ResourceGroupName myResourceGroup -Name myVmss -IdentityType "SystemAssigned"

后续步骤

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

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

先决条件

Azure Resource Manager 模板

与 Azure 门户和脚本一样,Azure 资源管理器模板支持部署由 Azure 资源组定义的新资源或修改后的资源。 有多种可用于执行模板编辑和部署的方法(包括本地方法和基于门户的方法),包括:

无论选择哪种方法,在初始部署和重新部署期间,模板语法都是相同的。 在新 VM 或现有 VM 上启用 Azure 资源托管标识的方式相同。 此外,默认情况下,Azure 资源管理器还会对部署执行增量更新

系统分配的托管标识

在此部分中,将使用 Azure 资源管理器模板启用和禁用系统分配托管标识。

在创建虚拟机规模集期间或在现有的虚拟机规模集上启用系统分配的托管标识

  1. 无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含虚拟机规模集的 Azure 订阅关联的帐户。

  2. 要启用系统分配托管标识,请将模板加载到编辑器中,在 resources 节中找到所关注的 Microsoft.Compute/virtualMachinesScaleSets 资源,并在与 identity 属性相同的级别添加 "type": "Microsoft.Compute/virtualMachinesScaleSets" 属性。 使用以下语法:

    "identity": {
        "type": "SystemAssigned"
    }
    
  3. 完成后,以下各部分应当会添加到模板的“资源”部分,并应类似于下面所示的示例:

     "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2018-06-01",
             "type": "Microsoft.Compute/virtualMachineScaleSets",
             "name": "[variables('vmssName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "SystemAssigned",
             },
            "properties": {
                 //other resource provider properties...
                 "virtualMachineProfile": {
                     //other virtual machine profile properties...
    
                 }
             }
         }
     ]
    

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

如果虚拟机规模集不再需要系统分配托管标识,请执行以下操作:

  1. 无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含虚拟机规模集的 Azure 订阅关联的帐户。

  2. 将模板加载到编辑器,并在 resources 部分找到相关的 Microsoft.Compute/virtualMachineScaleSets 资源。 如果 VM 只有系统分配的托管标识,则可以将标识类型更改为 None 来禁用它。

    Microsoft.Compute/virtualMachineScaleSets API 版本 2018-06-01

    如果 apiVersion 为 2018-06-01 并且 VM 同时具有系统和用户分配的托管标识,请从标识类型中删除 SystemAssigned 并保留 UserAssigned 以及 userAssignedIdentities 字典值。

    Microsoft.Compute/virtualMachineScaleSets API 版本 2018-06-01

    如果 apiVersion 为 2017-12-01 并且虚拟机规模集同时具有系统和用户分配的托管标识,请从标识类型中删除 SystemAssigned,并保留 UserAssigned 以及用户分配托管标识的 identityIds 数组。

    以下示例演示如何从没有用户分配托管标识的虚拟机规模集中删除系统分配托管标识:

    {
        "name": "[variables('vmssName')]",
        "apiVersion": "2018-06-01",
        "location": "[parameters(Location')]",
        "identity": {
            "type": "None"
         }
    
    }
    

用户分配的托管标识

在本部分中,将使用 Azure 资源管理器模板向虚拟机规模集分配用户分配托管标识。

注意

要使用 Azure 资源管理器模板创建用户分配托管标识,请参阅创建用户分配托管标识

将用户分配的托管标识分配给虚拟机规模集

  1. resources 元素下添加以下条目,向虚拟机规模集分配用户分配托管标识。 请务必将 <USERASSIGNEDIDENTITY> 替换为你创建的用户分配的托管标识的名称。

    Microsoft.Compute/virtualMachineScaleSets API 版本 2018-06-01

    如果 apiVersion 为 2018-06-01,则用户分配托管标识以 userAssignedIdentities 字典格式存储,并且 <USERASSIGNEDIDENTITYNAME> 值必须存储在模板的 variables 节中定义的某个变量中。

    {
        "name": "[variables('vmssName')]",
        "apiVersion": "2018-06-01",
        "location": "[parameters(Location')]",
        "identity": {
            "type": "userAssigned",
            "userAssignedIdentities": {
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
            }
        }
    
    }
    

    Microsoft.Compute/virtualMachineScaleSets API 版本 2017-12-01

    如果 apiVersion2017-12-01 或早期版本,则用户分配托管标识存储在 identityIds 数组中,并且 <USERASSIGNEDIDENTITYNAME> 值必须存储在模板的 variables 节中定义的某个变量中。

    {
        "name": "[variables('vmssName')]",
        "apiVersion": "2017-03-30",
        "location": "[parameters(Location')]",
        "identity": {
            "type": "userAssigned",
            "identityIds": [
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITY>'))]"
            ]
        }
    }
    
  2. 完成后,模板应当类似于以下示例:

    Microsoft.Compute/virtualMachineScaleSets API 版本 2018-06-01

    "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2018-06-01",
             "type": "Microsoft.Compute/virtualMachineScaleSets",
             "name": "[variables('vmssName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "UserAssigned",
                 "userAssignedIdentities": {
                     "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
                 }
             },
            "properties": {
                 //other virtual machine properties...
                 "virtualMachineProfile": {
                     //other virtual machine profile properties...
                 }
             }
         }
     ]
    

    Microsoft.Compute/virtualMachines API 版本 2017-12-01

    "resources": [
         {
             //other resource provider properties...
             "apiVersion": "2017-12-01",
             "type": "Microsoft.Compute/virtualMachineScaleSets",
             "name": "[variables('vmssName')]",
             "location": "[resourceGroup().location]",
             "identity": {
                 "type": "UserAssigned",
                 "identityIds": [
                     "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]"
                 ]
             },
            "properties": {
                 //other virtual machine properties...
                 "virtualMachineProfile": {
                     //other virtual machine profile properties...
                 }
             }
         }
     ]
    

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

如果虚拟机规模集不再需要用户分配托管标识,请执行以下操作:

  1. 无论是在本地登录到 Azure 还是通过 Azure 门户登录,请使用与包含虚拟机规模集的 Azure 订阅关联的帐户。

  2. 将模板加载到编辑器,并在 resources 部分找到相关的 Microsoft.Compute/virtualMachineScaleSets 资源。 如果虚拟机规模集只有用户分配的托管标识,则可以通过将标识类型更改为 None 来禁用它。

    以下示例演示如何从没有系统分配的托管标识的 VM 中删除所有用户分配的托管标识:

    {
        "name": "[variables('vmssName')]",
        "apiVersion": "2018-06-01",
        "location": "[parameters(Location')]",
        "identity": {
            "type": "None"
         }
    }
    

    Microsoft.Compute/virtualMachineScaleSets API 版本 2018-06-01

    若要从虚拟机规模集中删除单个用户分配的托管标识,请将其从 userAssignedIdentities 字典中删除。

    如果具有系统分配的标识,请将其保持在 identity 值下的 type 值中。

    Microsoft.Compute/virtualMachineScaleSets API 版本 2017-12-01

    要从虚拟机规模集中删除单个用户分配托管标识,请将其从 identityIds 数组中删除。

    如果具有系统分配的托管标识,请将其保持在 identity 值下的 type 值中。

后续步骤

本文介绍如何在虚拟机规模集上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来执行以下 Azure 资源托管标识操作:

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

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

先决条件

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

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

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

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

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

    注意

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

系统分配的托管标识

本部分将介绍如何在虚拟机规模集上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来启用和禁用系统分配的托管标识。

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

若要创建启用了系统分配的托管标识的虚拟机规模集,则需要创建虚拟机规模集并检索访问令牌,以使用 CURL 通过系统分配的托管标识类型值对资源管理器终结点进行调用。

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

    az group create --name myResourceGroup --location westus
    
  2. 为虚拟机规模集创建网络接口

     az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
    
  3. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  4. 使用 Azure Cloud Shell,通过 CURL 调用 Azure 资源管理器 REST 终结点来创建虚拟机规模集。 下面的示例在“myResourceGroup”中创建名为“myVMSS”的虚拟机规模集,该规模集具有系统分配的托管标识(请求正文中用值 "identity":{"type":"SystemAssigned"} 进行标识) 。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PUT -d '{"sku":{"tier":"Standard","capacity":3,"name":"Standard_D1_v2"},"location":"eastus","identity":{"type":"SystemAssigned"},"properties":{"overprovision":true,"virtualMachineProfile":{"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"createOption":"FromImage"}},"osProfile":{"computerNamePrefix":"myVMSS","adminUsername":"azureuser","adminPassword":"myPassword12"},"networkProfile":{"networkInterfaceConfigurations":[{"name":"myVMSS","properties":{"primary":true,"enableIPForwarding":true,"ipConfigurations":[{"name":"myVMSS","properties":{"subnet":{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"}}}]}}]}},"upgradePolicy":{"mode":"Manual"}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "sku":{
           "tier":"Standard",
           "capacity":3,
           "name":"Standard_D1_v2"
        },
        "location":"eastus",
        "identity":{
           "type":"SystemAssigned"
        },
        "properties":{
           "overprovision":true,
           "virtualMachineProfile":{
              "storageProfile":{
                 "imageReference":{
                    "sku":"2016-Datacenter",
                    "publisher":"MicrosoftWindowsServer",
                    "version":"latest",
                    "offer":"WindowsServer"
                 },
                 "osDisk":{
                    "caching":"ReadWrite",
                    "managedDisk":{
                       "storageAccountType":"StandardSSD_LRS"
                    },
                    "createOption":"FromImage"
                 }
              },
              "osProfile":{
                 "computerNamePrefix":"myVMSS",
                 "adminUsername":"azureuser",
                 "adminPassword":"myPassword12"
              },
              "networkProfile":{
                 "networkInterfaceConfigurations":[
                    {
                       "name":"myVMSS",
                       "properties":{
                          "primary":true,
                          "enableIPForwarding":true,
                          "ipConfigurations":[
                             {
                                "name":"myVMSS",
                                "properties":{
                                   "subnet":{
                                      "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"
                                   }
                                }
                             }
                          ]
                       }
                    }
                 ]
              }
           },
           "upgradePolicy":{
              "mode":"Manual"
           }
        }
     }  
    

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

要在现有虚拟机规模集上启用系统分配的托管标识,需要获取访问令牌,然后使用 CURL 对资源管理器 REST 终结点进行调用以更新标识类型。

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  2. 使用以下 CURL 命令对 Azure 资源管理器 REST 终结点进行调用,为名为“myVMSS”的虚拟机规模集启用系统分配的托管标识(在请求正文中用值 {"identity":{"type":"SystemAssigned"} 进行标识)。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    重要

    若要确保不删除用户分配给虚拟机规模集的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"。 如果具有用户分配给虚拟机规模集的任何标识(响应中用值 identity 进行标识),请跳过步骤 3,该步骤介绍了如何在虚拟机规模集上启用系统分配的托管标识的同时保留用户分配的托管标识。

     curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned"}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned"
        }
     }
    
  3. 要在具有现有用户分配的托管标识的虚拟机规模集上启用系统分配的托管标识,需要将 SystemAssigned 添加到 type 值。

    例如,如果虚拟机规模集具有用户分配给它的托管标识 ID1ID2,并且你希望向该虚拟机规模集添加系统分配的托管标识,请使用以下 CURL 调用。 将 <ACCESS TOKEN><SUBSCRIPTION ID> 替换为适合环境的值。

    API 版本 2018-06-01 以字典格式将用户分配的托管标识存储在 userAssignedIdentities 值中,而 API 版本 2017-12-01 则以数组格式将托管标识存储在 identityIds 值中。

    API 版本 2018-06-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned,UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{},"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{}}}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned,UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
              },
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned,UserAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1","/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"]}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned,UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1",
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"
           ]
        }
     }
    

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

要在现有虚拟机规模集上禁用系统分配的标识,需要获取访问令牌,然后使用 CURL 对资源管理器 REST 终结点进行调用以将标识类型更新为 None

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  2. 通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用以禁用系统分配的托管标识,更新虚拟机规模集。 下面的示例从名为“myVMSS”的虚拟机规模集上禁用系统分配的托管标识(在请求正文中用值 {"identity":{"type":"None"}} 进行标识)。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    重要

    若要确保不删除用户分配给虚拟机规模集的任何现有托管标识,需要使用以下 CURL 命令列出用户分配的托管标识:curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"。 如果具有用户分配给虚拟机规模集的任何托管标识,请跳过步骤 3,该步骤介绍了如何在从虚拟机规模集中删除系统分配的托管标识的同时保留用户分配的托管标识。

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"None"}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"None"
        }
     }
    

    如果使用的是 API version 2018-06-01,若要从具有用户分配的托管标识的虚拟机规模集中删除系统分配的托管标识,请从 {"identity":{"type:" "}} 值中删除 SystemAssigned,同时保留 UserAssigned 值和 userAssignedIdentities 字典值。 如果使用的是 API 版本 2017-12-01 或早期版本,请保留 identityIds 数组。

用户分配的托管标识

本部分将介绍如何在 Azure 虚拟机规模集上通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用来添加和删除用户分配的托管标识。

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

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  2. 为虚拟机规模集创建网络接口

     az network nic create -g myResourceGroup --vnet-name myVnet --subnet mySubnet -n myNic
    
  3. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  4. 按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识

  5. 通过使用 CURL 对 Azure 资源管理器 REST 终结点进行调用,创建虚拟机规模集。 下面的示例在资源组“myResourceGroup”中创建名为“myVMSS”的虚拟机规模集,该规模集具有用户分配的托管标识 ID1(请求正文中用值 "identity":{"type":"UserAssigned"} 进行标识)。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    API 版本 2018-06-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PUT -d '{"sku":{"tier":"Standard","capacity":3,"name":"Standard_D1_v2"},"location":"eastus","identity":{"type":"UserAssigned","userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{}}},"properties":{"overprovision":true,"virtualMachineProfile":{"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"createOption":"FromImage"}},"osProfile":{"computerNamePrefix":"myVMSS","adminUsername":"azureuser","adminPassword":"myPassword12"},"networkProfile":{"networkInterfaceConfigurations":[{"name":"myVMSS","properties":{"primary":true,"enableIPForwarding":true,"ipConfigurations":[{"name":"myVMSS","properties":{"subnet":{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"}}}]}}]}},"upgradePolicy":{"mode":"Manual"}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "sku":{
           "tier":"Standard",
           "capacity":3,
           "name":"Standard_D1_v2"
        },
        "location":"eastus",
        "identity":{
           "type":"UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
    
              }
           }
        },
        "properties":{
           "overprovision":true,
           "virtualMachineProfile":{
              "storageProfile":{
                 "imageReference":{
                    "sku":"2016-Datacenter",
                    "publisher":"MicrosoftWindowsServer",
                    "version":"latest",
                    "offer":"WindowsServer"
                 },
                 "osDisk":{
                    "caching":"ReadWrite",
                    "managedDisk":{
                       "storageAccountType":"StandardSSD_LRS"
                    },
                    "createOption":"FromImage"
                 }
              },
              "osProfile":{
                 "computerNamePrefix":"myVMSS",
                 "adminUsername":"azureuser",
                 "adminPassword":"myPassword12"
              },
              "networkProfile":{
                 "networkInterfaceConfigurations":[
                    {
                       "name":"myVMSS",
                       "properties":{
                          "primary":true,
                          "enableIPForwarding":true,
                          "ipConfigurations":[
                             {
                                "name":"myVMSS",
                                "properties":{
                                   "subnet":{
                                      "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"
                                   }
                                }
                             }
                          ]
                       }
                    }
                 ]
              }
           },
           "upgradePolicy":{
              "mode":"Manual"
           }
        }
     }
    

    API 版本 2017-12-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01' -X PUT -d '{"sku":{"tier":"Standard","capacity":3,"name":"Standard_D1_v2"},"location":"eastus","identity":{"type":"UserAssigned","identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]},"properties":{"overprovision":true,"virtualMachineProfile":{"storageProfile":{"imageReference":{"sku":"2016-Datacenter","publisher":"MicrosoftWindowsServer","version":"latest","offer":"WindowsServer"},"osDisk":{"caching":"ReadWrite","managedDisk":{"storageAccountType":"StandardSSD_LRS"},"createOption":"FromImage"}},"osProfile":{"computerNamePrefix":"myVMSS","adminUsername":"azureuser","adminPassword":"myPassword12"},"networkProfile":{"networkInterfaceConfigurations":[{"name":"myVMSS","properties":{"primary":true,"enableIPForwarding":true,"ipConfigurations":[{"name":"myVMSS","properties":{"subnet":{"id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"}}}]}}]}},"upgradePolicy":{"mode":"Manual"}}}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
    
    PUT https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "sku":{
           "tier":"Standard",
           "capacity":3,
           "name":"Standard_D1_v2"
        },
        "location":"eastus",
        "identity":{
           "type":"UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        },
        "properties":{
           "overprovision":true,
           "virtualMachineProfile":{
              "storageProfile":{
                 "imageReference":{
                    "sku":"2016-Datacenter",
                    "publisher":"MicrosoftWindowsServer",
                    "version":"latest",
                    "offer":"WindowsServer"
                 },
                 "osDisk":{
                    "caching":"ReadWrite",
                    "managedDisk":{
                       "storageAccountType":"StandardSSD_LRS"
                    },
                    "createOption":"FromImage"
                 }
              },
              "osProfile":{
                 "computerNamePrefix":"myVMSS",
                 "adminUsername":"azureuser",
                 "adminPassword":"myPassword12"
              },
              "networkProfile":{
                 "networkInterfaceConfigurations":[
                    {
                       "name":"myVMSS",
                       "properties":{
                          "primary":true,
                          "enableIPForwarding":true,
                          "ipConfigurations":[
                             {
                                "name":"myVMSS",
                                "properties":{
                                   "subnet":{
                                      "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet"
                                   }
                                }
                             }
                          ]
                       }
                    }
                 ]
              }
           },
           "upgradePolicy":{
              "mode":"Manual"
           }
        }
     }
    

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

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  2. 按照此处的说明创建用户分配的托管标识:创建用户分配的托管标识

  3. 若要确保不删除用户或系统分配给虚拟机规模集的现有托管标识,需要使用以下 CURL 命令列出分配给虚拟机规模集的标识。 如果具有分配给虚拟机规模集的托管标识,则这些标识会在 identity 值中列出。

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>"
    
    GET https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    授权 必需。 设置为有效的 Bearer 访问令牌。
  4. 如果没有用户或系统分配给虚拟机规模集的任何托管标识,请使用以下 CURL 命令对 Azure 资源管理器 REST 终结点进行调用,以将第一个用户分配的托管标识分配给虚拟机规模集。 如果具有用户或系统分配给虚拟机规模集的托管标识,请跳过步骤 5,该步骤介绍了如何将多个用户分配的托管标识添加到虚拟机规模集并同时保留系统分配的托管标识。

    下面的示例将用户分配的托管标识 ID1 分配给 资源组“myResourceGroup”中名为“myVMSS”的虚拟机规模集。 请将 <ACCESS TOKEN> 替换为上一步中请求持有者访问令牌和适合环境的 <SUBSCRIPTION ID> 值时收到的值。

    API 版本 2018-06-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-12-01' -X PATCH -d '{"identity":{"type":"userAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{}}}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"userAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"userAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"userAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        }
     }
    
  5. 如果具有用户或系统分配给虚拟机规模集的现有托管标识,则:

    API 版本 2018-06-01

    将用户分配的托管标识添加到 userAssignedIdentities 字典值。

    例如,如果你具有当前分配给虚拟机规模的系统分配的托管标识和用户分配的托管标识 ID1 并希望将用户分配的托管标识 ID2 添加到该虚拟机规模,则:

    curl  'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{},"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{}}}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1":{
    
              },
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":{
    
              }
           }
        }
     }
    

    API 版本 2017-12-01

    identityIds 数组值中保留要保持的用户分配的托管标识,同时添加新的用户分配的托管标识。

    例如,如果你具有当前分配给虚拟机规模集的系统分配的标识和用户分配的托管标识 ID1 并希望将用户分配的托管标识 ID2 添加到该虚拟机规模集,则:

    curl  'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1","/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"]}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1",
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2"
           ]
        }
     }
    

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

  1. 检索持有者访问令牌,下一步在授权标头中将使用该令牌创建具有系统分配的托管标识的虚拟机规模集。

    az account get-access-token
    
  2. 若要确保不删除任何现有用户分配的托管标识(希望保留在虚拟机规模集上)或不删除系统分配的托管标识,需要使用以下 CURL 命令列出这些托管标识:

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01' -H "Authorization: Bearer <ACCESS TOKEN>" 
    
    GET https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/virtualMachineScaleSets/<VMSS NAME>?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    授权 必需。 设置为有效的 Bearer 访问令牌。

    如果具有分配给 VM 的托管标识,则这些标识会在 identity 值下列出。

    例如,如果你有分配给虚拟机规模集的用户分配的托管标识 ID1ID2,并且仅希望保持分配 ID1 并保留系统分配的托管标识:

    API 版本 2018-06-01

    null 添加到要删除的用户分配的托管标识:

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned, UserAssigned", "userAssignedIdentities":{"/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":null}}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned, UserAssigned",
           "userAssignedIdentities":{
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID2":null
           }
        }
     }
    

    API 版本 2017-12-01

    identityIds 数组中仅保留要保持的用户分配的托管标识:

    curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01' -X PATCH -d '{"identity":{"type":"SystemAssigned,UserAssigned", "identityIds":["/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"]}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
    
    PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2017-12-01 HTTP/1.1
    

    请求标头

    请求标头 说明
    Content-Type 必需。 设置为 application/json
    授权 必需。 设置为有效的 Bearer 访问令牌。

    请求正文

     {
        "identity":{
           "type":"SystemAssigned,UserAssigned",
           "identityIds":[
              "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"
           ]
        }
     }
    

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

curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"SystemAssigned"}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
Content-Type 必需。 设置为 application/json
授权 必需。 设置为有效的 Bearer 访问令牌。

请求正文

{
   "identity":{
      "type":"SystemAssigned"
   }
}

如果虚拟机规模集只具有用户分配的托管标识并希望删除所有这些标识,请使用以下命令:

curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01' -X PATCH -d '{"identity":{"type":"None"}}' -H "Content-Type: application/json" -H Authorization:"Bearer <ACCESS TOKEN>"
PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSS?api-version=2018-06-01 HTTP/1.1

请求标头

请求标头 说明
Content-Type 必需。 设置为 application/json
授权 必需。 设置为有效的 Bearer 访问令牌。

请求正文

{
   "identity":{
      "type":"None"
   }
}

后续步骤

有关如何使用 REST 创建、列出或删除用户分配的托管标识,请参阅: