閱讀英文

共用方式為

教程:将用户分配的托管标识添加到现有虚拟机或虚拟机规模集

需要使用 Azure Monitoring Agent 的现有虚拟机和虚拟机规模集必须更新为使用用户分配的托管标识。 本文介绍分配自定义定义所需的步骤,该自定义定义通过 Azure Policy 将用户分配的标识大规模添加到这些资源。

注意

必须为定义模板分配禁用强制模式 (DoNotEnforce),以防止新创建的资源发生故障。

先决条件

  • 创建用户分配的标识,该标识具有在资源中安装 Azure Monitoring Agent 所需的权限。

创建、分配和修正策略定义

使用门户

若要修正现有资源,请执行以下步骤:

  1. 在 Azure 门户中单击“所有服务”,然后搜索并选择“策略”,启动 Azure Policy 服务。

  2. 选择“Azure Policy”页左侧的“定义”

  3. 使用“+策略定义”按钮创建自定义策略定义。

  4. 在选项卡中设置以下选项:

    • 定义位置:设置为目标范围。
    • 名称:设置为自定义定义的名称。 示例:“修改现有 VM 和 VMSS 上的标识 [分配为禁用强制模式]
  5. 在“策略规则”json 块中,删除示例 JSON 并粘贴以下使用 modify 效果的定义,以添加用户分配的标识:

    {
      "mode": "Indexed",
      "parameters": {
        "userAssignedIdentities": {
          "type": "String",
          "metadata": {
            "displayName": "userAssignedIdentities"
          }
        }
      },
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "in": [
                "Microsoft.Compute/virtualMachines",
                "Microsoft.Compute/virtualMachineScaleSets"
              ]
            },
            {
              "value": "[requestContext().apiVersion]",
              "greaterOrEquals": "2018-10-01"
            },
            {
              "field": "identity.userAssignedIdentities",
              "notContainsKey": "[parameters('userAssignedIdentities')]"
            }
          ]
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/microsoft.authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c"
            ],
            "operations": [
              {
                "operation": "AddOrReplace",
                "field": "identity.type",
                "value": "[if(contains(field('identity.type'), 'SystemAssigned'), 'SystemAssigned,UserAssigned', 'UserAssigned')]"
              },
              {
                "operation": "addOrReplace",
                "field": "identity.userAssignedIdentities",
                "value": "[createObject(parameters('userAssignedIdentities'), createObject())]"
              }
            ]
          }
        }
      }
    }
    
    
  6. 选择“保存”。 成功创建自定义策略定义后,系统将填充定义视图。 选择“分配”按钮或导航到“分配”选项卡以分配定义。

  7. 确保“范围”和“基本信息”中的信息已按预期设置。

  8. 将“策略强制实施”设置为“已禁用”。 EnforcementMode 在资源创建或更新时禁用任何强制执行操作。 详细了解强制模式

    注意

    必须为定义模板分配禁用强制模式 (DoNotEnforce),以防止新创建的资源发生故障。

  9. 选择“参数”选项卡。参数 userAssignedIdentities 需要现有用户分配的标识 ID,该标识 ID 对虚拟机或虚拟机规模集具有适当的权限。 应按以下格式输入 ID:/subscriptions/subID/resourceGroups/RGName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testUAMI

  10. 选择“修正”选项卡,勾选“创建修正任务”框,以便可以修正任何现有的虚拟机和虚拟机规模集。 对于管理组级别的分配,可以在创建分配后按照修正资源教程触发修正。

  11. 确保“托管标识”中的信息与预期相同

  12. 选择“查看 + 创建”。 自定义定义已分配。 对于订阅级别或更低级别的分配,将通过策略修正任务对现有虚拟机和虚拟机规模集进行修正。 任何未来的虚拟机和虚拟机规模集或管理组级别的分配都必须按照修正资源教程进行修正。

使用 PowerShell

  1. 使用以下 JSON 代码片段创建名为 ModifyVMIdentities.json 的 JSON 文件。

    {
      "mode": "Indexed",
      "parameters": {
        "userAssignedIdentities": {
          "type": "String",
          "metadata": {
            "displayName": "userAssignedIdentities"
          }
        }
      },
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "in": [
                "Microsoft.Compute/virtualMachines",
                "Microsoft.Compute/virtualMachineScaleSets"
              ]
            },
            {
              "value": "[requestContext().apiVersion]",
              "greaterOrEquals": "2018-10-01"
            },
            {
              "field": "identity.userAssignedIdentities",
              "notContainsKey": "[parameters('userAssignedIdentities')]"
            }
          ]
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/microsoft.authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c"
            ],
            "operations": [
              {
                "operation": "AddOrReplace",
                "field": "identity.type",
                "value": "[if(contains(field('identity.type'), 'SystemAssigned'), 'SystemAssigned,UserAssigned', 'UserAssigned')]"
              },
              {
                "operation": "addOrReplace",
                "field": "identity.userAssignedIdentities",
                "value": "[createObject(parameters('userAssignedIdentities'), createObject())]"
              }
            ]
          }
        }
      }
    }
    

    有关编写策略定义的详细信息,请参阅 Azure Policy 定义结构

  2. 运行以下命令,使用 ModifyVMIdentities.json 文件创建策略定义。

    New-AzPolicyDefinition -Name 'ModifyVMIdentities' -DisplayName 'Modify identities on existing VMs and VMSS' -Policy 'ModifyVMIdentities.json'
    

    命令将创建一个名为在现有 VM 和 VMSS 上修改标识的策略定义。

    在没有位置参数的情况下调用时,New-AzPolicyDefinition 默认将策略定义保存在会话上下文的选定订阅中。 若要将定义保存到其他位置,请使用以下参数:

    • SubscriptionId - 保存到其他订阅。 需要 GUID 值。
    • ManagementGroupName - 保存到管理组。 需要字符串值。
  3. 创建策略定义后,可运行以下命令创建策略分配:

    $Subscription = Get-AzSubscription -SubscriptionName 'Subscription01'
    $Policy = Get-AzPolicyDefinition -Name 'ModifyVMIdentities'
    $VMuserassignedidentity = Get-AzUserAssignedIdentity -ResourceGroupName 'NMidentityRG' -Name $VMuserassignedidentityname
    $VMuserassignedidentityid = $VMuserassignedidentity.Id
    New-AzPolicyAssignment -Name 'ModifyVMIdentities' -PolicyDefinition $Policy -Scope "/subscriptions/$($Subscription.Id)" -EnforcementMode DoNotEnforce -Location 'chinaeast2' -IdentityType "SystemAssigned" -PolicyParameterObject $VMuserassignedidentityid
    

    注意

    必须为定义分配禁用强制模式 (DoNotEnforce),以防止新创建的资源发生故障。

    Subscription01 替换为所需资源组的名称。

    Scope 参数在管理组、订阅、资源组或单个资源中工作。 该参数使用完整资源路径,它将返回 Get-AzResourceGroup 属性。 每个容器的范围模式如下所示。 将 {rName}{rgName}{subId}{mgName} 分别替换为你的资源名称、资源组名称、订阅 ID 和管理组名称。 {rType} 将替换为资源的资源类型,例如 VM 的 Microsoft.Compute/virtualMachines

    • 资源 - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • 资源组 - /subscriptions/{subId}/resourceGroups/{rgName}
    • 订阅 - /subscriptions/{subId}
    • 管理组 - /providers/Microsoft.Management/managementGroups/{mgName}
  4. 创建策略分配后,可以通过运行以下命令创建修正任务,将标识添加到现有虚拟机和虚拟机规模集资源:

    Start-AzPolicyRemediation -Name 'remediationVMidentities' -PolicyAssignmentId '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/ModifyVMIdentities'
    

后续步骤