你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

自动将实验室用户添加到 Azure 开发测试实验室中的实验室

通过 Azure 开发测试实验室,可以使用 Azure 门户快速创建自助服务开发测试环境。 但是,如果你有多个团队和多个开发测试实验室实例,则自动执行创建过程可以节省时间。 使用 Azure 资源管理器模板,可以创建实验室、实验室 VM、自定义映像、公式,并自动添加用户。 本文专门介绍如何将用户添加到开发测试实验室实例。

若要将用户添加到实验室,请将用户添加到实验室的“开发测试实验室用户”角色。 本文介绍如何使用以下方法之一自动将用户添加到实验室:

  • Azure 资源管理器模板
  • Azure PowerShell cmdlet
  • Azure CLI。

使用 Azure 资源管理器模板

以下示例资源管理器模板指定要添加到实验室的“开发测试实验室用户”角色的用户。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "The objectId of the user, group, or service principal for the role."
      }
    },
    "labName": {
      "type": "string",
      "metadata": {
        "description": "The name of the lab instance to be created."
      }
    },
    "roleAssignmentGuid": {
      "type": "string",
      "metadata": {
        "description": "Guid to use as the name for the role assignment."
      }
    }
  },
  "variables": {
    "devTestLabUserRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/111111111-0000-0000-11111111111111111')]",
    "fullDevTestLabUserRoleName": "[concat(parameters('labName'), '/Microsoft.Authorization/', parameters('roleAssignmentGuid'))]",
    "roleScope": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.DevTestLab/labs/', parameters('labName'))]"
  },
  "resources": [
    {
      "apiVersion": "2016-05-15",
      "type": "Microsoft.DevTestLab/labs",
      "name": "[parameters('labName')]",
      "location": "[resourceGroup().location]"
    },
    {
      "apiVersion": "2016-07-01",
      "type": "Microsoft.DevTestLab/labs/providers/roleAssignments",
      "name": "[variables('fullDevTestLabUserRoleName')]",
      "properties": {
        "roleDefinitionId": "[variables('devTestLabUserRoleId')]",
        "principalId": "[parameters('principalId')]",
        "scope": "[variables('roleScope')]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.DevTestLab/labs', parameters('labName'))]"
      ]
    }
  ]
}

如果要在创建实验室的同一模板中分配角色,请记住在角色分配资源和实验室之间添加依赖关系。 有关详细信息,请参阅在 Azure 资源管理器模板中定义依赖关系一文。

角色分配资源信息

角色分配资源需要指定类型和名称。

首先要注意的是,资源的类型不是 Microsoft.Authorization/roleAssignments,它是资源组的类型。 资源类型遵循模式 {provider-namespace}/{resource-type}/providers/roleAssignments。 在这种情况下,资源类型将是 Microsoft.DevTestLab/labs/providers/roleAssignments

角色分配名称本身必须是全局唯一的。 分配的名称使用模式 {labName}/Microsoft.Authorization/{newGuid}newGuid 是模板的参数值。 它可确保角色分配名称是唯一的。 由于没有用于创建 GUID 的模板功能,因此需要使用任何 GUID 生成器工具自行生成 GUID。

在模板中,角色分配的名称由 fullDevTestLabUserRoleName 变量定义。 模板中的具体行是:

"fullDevTestLabUserRoleName": "[concat(parameters('labName'), '/Microsoft.Authorization/', parameters('roleAssignmentGuid'))]"

角色分配资源属性

角色分配本身定义了三个属性。 它需要 roleDefinitionIdprincipalIdscope

角色定义

角色定义 ID 是现有角色定义的字符串标识符。 角色 ID 的格式为 /subscriptions/{subscription-id}/providers/Microsoft.Authorization/roleDefinitions/{role-definition-id}

使用 subscription().subscriptionId 模板函数获取订阅 ID。

需要获取 DevTest Labs User 内置角色的角色定义。 若要获取开发测试实验室用户角色的 GUID,可以使用 角色分配 REST APIGet-AzRoleDefinition cmdlet。

$dtlUserRoleDefId = (Get-AzRoleDefinition -Name "DevTest Labs User").Id

角色 ID 在 variables 节中定义并命名为 devTestLabUserRoleId。 在模板中,角色 ID 设置为:111111111-0000-0000-11111111111111111。

"devTestLabUserRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/111111111-0000-0000-11111111111111111')]",

主体 ID

主体 ID 是要作为实验室用户添加到实验室的 Active Directory 用户、组或服务主体的对象 ID。 模板使用 ObjectId 作为参数。

可以通过使用 Get-AzureRMADUser、[Get-AzureRMADGroup 或 Get-AzureRMADServicePrincipal PowerShell cmdlet 获取 ObjectId。 这些 cmdlet 返回单个 Active Directory 对象或对象列表,这些对象具有 ID 属性,它是所需的对象 ID。 以下示例演示如何获取公司中单个用户的对象 ID。

$userObjectId = (Get-AzureRmADUser -UserPrincipalName 'email@company.com').Id

还可以使用 Microsoft Graph PowerShell cmdlet,其中包括 Get-MgUserGet-MgGroupGet-MgServicePrincipal

范围

范围指定应应用角色分配的资源或资源组。 对于资源,范围的格式为:/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{provider-namespace}/{resource-type}/{resource-name}。 模板使用 subscription().subscriptionId 函数填充 subscription-id 部分,并使用 resourceGroup().name 模板函数填充 resource-group-name 部分。 使用这些函数意味着要向其分配角色的实验室必须存在于当前订阅,以及对其进行模板部署的同一资源组中。 最后一个部分 resource-name 是实验室的名称。 此值是通过此示例中的模板参数接收的。

模板中的角色范围:

"roleScope": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.DevTestLab/labs/', parameters('labName'))]"

部署模板

首先,创建可在资源管理器模板中传递参数值的参数文件(例如:azuredeploy.parameters.json)。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "principalId": {
      "value": "11111111-1111-1111-1111-111111111111"
    },
    "labName": {
      "value": "MyLab"
    },
    "roleAssignmentGuid": {
      "value": "22222222-2222-2222-2222-222222222222"
    }
  }
}

然后,使用 New-AzureRmResourceGroupDeployment PowerShell cmdlet 部署资源管理器模板。 以下示例命令将用户、组或服务主体分配给实验室的“开发测试实验室用户”角色。

New-AzureRmResourceGroupDeployment -Name "MyLabResourceGroup-$(New-Guid)" -ResourceGroupName 'MyLabResourceGroup' -TemplateParameterFile .\azuredeploy.parameters.json -TemplateFile .\azuredeploy.json

注意

组部署名称和角色分配 GUID 必须是唯一的。 如果尝试使用非唯一 GUID 部署资源分配,则会出现 RoleAssignmentUpdateNotPermitted 错误。

如果计划多次使用该模板将多个 Active Directory 对象添加到实验室的“开发测试实验室用户”角色,请考虑在 PowerShell 命令中使用动态对象。 以下示例使用 New-Guid cmdlet 动态指定资源组部署名称和角色分配 GUID。

New-AzureRmResourceGroupDeployment -Name "MyLabResourceGroup-$(New-Guid)" -ResourceGroupName 'MyLabResourceGroup' -TemplateFile .\azuredeploy.json -roleAssignmentGuid "$(New-Guid)" -labName "MyLab" -principalId "11111111-1111-1111-1111-111111111111"

使用 Azure PowerShell

如简介中所述,创建新的 Azure 角色分配,以便将用户添加到实验室的“开发测试实验室用户”角色。 在 PowerShell 中,可以使用 New-AzureRMRoleAssignment cmdlet 来执行此操作。 此 cmdlet 具有多个可选参数,以实现灵活性。 可以将 ObjectIdSigninNameServicePrincipalName 指定为要对其授予权限的对象。

下面是将用户添加到指定实验室中的“开发测试实验室用户”角色的示例 Azure PowerShell 命令。

New-AzureRmRoleAssignment -UserPrincipalName <email@company.com> -RoleDefinitionName 'DevTest Labs User' -ResourceName '<Lab Name>' -ResourceGroupName '<Resource Group Name>' -ResourceType 'Microsoft.DevTestLab/labs'

若要指定要对其授予权限的资源,可以通过 ResourceNameResourceTypeResourceGroup 的组合或 scope 参数进行指定。 无论使用哪种参数组合,都可以为 cmdlet 提供足够的信息来唯一标识 Active Directory 对象(用户、组或服务主体)、范围(资源组或资源)以及角色定义。

使用 Azure CLI

在 Azure CLI 中,使用 az role assignment create 命令将实验室用户添加到实验室。 有关 Azure CLI cmdlet 的详细信息,请参阅使用 Azure CLI 添加或删除 Azure 角色分配

被授予访问权限的对象可以由 objectIdsignInNamespn 参数指定。 向对象授予访问权限的实验室可以通过 scope URL 或 resource-nameresource-typeresource-group 参数的组合进行标识。

以下 Azure CLI 示例演示如何将用户添加到指定实验室的“开发测试实验室用户”角色。

az role assignment create --roleName "DevTest Labs User" --signInName <email@company.com> -–resource-name "<Lab Name>" --resource-type "Microsoft.DevTestLab/labs" --resource-group "<Resource Group Name>" --role Contributor --scope /subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroupName>

后续步骤

请参阅以下文章: