Поделиться через


Автоматизация добавления пользователя тестовой службы Azure DevTest Labs

Azure DevTest Labs позволяет быстро создавать среды самообслуживания для разработки и тестирования с помощью портала Azure. Однако если у вас несколько команд и несколько экземпляров DevTest Labs, автоматизация процесса создания позволит сэкономить время. Шаблоны Azure Resource Manager позволяют создавать тестовые службы, виртуальные машины тестовых служб, пользовательские образы, формулы, а также добавлять пользователей в автоматическом режиме. В этой статье особое внимание уделяется добавлению пользователей в экземпляр DevTest Labs.

Чтобы добавить пользователя в тестовую службу, добавьте его в роль Пользователь DevTest Labs для тестовой службы. В этой статье показано, как автоматизировать добавление пользователя в тестовую службу одним из следующих способов.

  • Шаблоны Azure Resource Manager
  • Командлеты Azure PowerShell
  • Azure CLI.

Использование шаблонов Azure Resource Manager

В следующем примере шаблона Resourse Manager указывается пользователь, которого необходимо добавить в роль Пользователь DevTest Labs тестовой службы.

{
  "$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 Resource Manager.

Сведения о ресурсах назначения ролей

Ресурс назначения ролей должен указывать тип и имя.

Прежде всего следует отметить, что 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'))]"

Свойства ресурса назначения ролей

Само назначение ролей определяет три свойства. Ему требуются roleDefinitionId, principalId и scope.

Определение роли

Идентификатор определения роли — это идентификатор строки для существующего определения роли. Идентификатор роли имеет форму /subscriptions/{subscription-id}/providers/Microsoft.Authorization/roleDefinitions/{role-definition-id}.

Для получения идентификатора подписки используется функция шаблона subscription().subscriptionId.

Необходимо получить определение роли для встроенной роли DevTest Labs User. Чтобы получить GUID для роли Пользователь DevTest Labs, можно использовать REST API назначения ролей или командлет Get-AzRoleDefinition.

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

Идентификатор роли определяется в разделе переменных и получает имя devTestLabUserRoleId. В шаблоне идентификатору роли задается следующее значение: 111111111-0000-0000-11111111111111111.

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

Идентификатор субъекта

Идентификатор субъекта — это идентификатор объекта пользователя, группы или субъекта-службы AD DS, который вы хотите добавить в тестовую службу в качестве пользователя тестовой службы. Шаблон использует ObjectId в качестве параметра.

ObjectId можно получить с помощью командлетов PowerShell Get-AzureRMADUser, [Get-AzureRMADGroup или Get-AzureRMADServicePrincipal. Эти командлеты возвращают один объект или список объектов AD DS со свойством идентификатора. Оно и является тем идентификатором объекта, который вам нужен. В следующем примере показано, как получить идентификатор объекта одного пользователя в компании.

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

Вы также можете использовать командлеты Microsoft Graph PowerShell, которые включают Get-MgUser, Get-MgGroup и Get-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), который будет передавать значения для параметров в шаблоне Resource Manager.

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

Затем используйте командлет PowerShell New-AzureRmResourceGroupDeployment, чтобы развернуть шаблон Resource Manager. В следующем примере команда назначает пользователю, группе или субъекту-службе роль пользователя DevTest Labs для тестовой службы.

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

Примечание

Имя развертывания группы и GUID назначения роли должно быть уникальным. При попытке развернуть назначение ресурса с идентификатором GUID, не являющимся уникальным, вы уведите сообщение об ошибке RoleAssignmentUpdateNotPermitted.

Если вы планируете использовать шаблон несколько раз, чтобы добавить несколько объектов AD DS к роли пользователя DevTest Labs для тестовой службы, рассмотрите возможность использования динамических объектов в команде PowerShell. В следующем примере используется командлет New-Guid для динамического задания имени развертывания группы ресурсов и GUID назначения ролей.

New-AzureRmResourceGroupDeployment -Name "MyLabResourceGroup-$(New-Guid)" -ResourceGroupName 'MyLabResourceGroup' -TemplateFile .\azuredeploy.json -roleAssignmentGuid "$(New-Guid)" -labName "MyLab" -principalId "aaaaaaaa-bbbb-cccc-1111-222222222222"

Использование Azure PowerShell

Как и говорилось во введении, вы создаете новое назначение ролей Azure, чтобы добавить пользователя в роль Пользователь DevTest Labs для тестовой службы. В PowerShell это можно сделать с помощью командлета New-AzureRMRoleAssignment. Этот командлет имеет множество необязательных параметров, что обеспечивает гибкость. ObjectId, SigninName или ServicePrincipalName можно задать как объект, которому предоставляются разрешения.

Ниже приведен пример команды Azure PowerShell, которая добавляет пользователя в роль пользователя DevTest Labs в указанной тестовой службе.

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

Для задания ресурса, которому предоставляются разрешения, можно использовать сочетание ResourceName, ResourceType, ResourceGroup или параметр scope. Независимо от того, какое сочетание параметров используется, предоставьте командлету достаточно сведений для уникальной идентификации объекта AD DS (пользователя, группы или субъекта-службы), области (группы ресурсов или ресурса) и определения роли.

Использование Azure CLI

В Azure CLI добавление пользователя тестовой службы в тестовую службу выполняется с помощью команды az role assignment create. Дополнительные сведения о командлетах Azure CLI см. в статье Добавление и удаление назначений ролей Azure с помощью Azure CLI.

Объект, которому предоставляется доступ, можно задать параметрами objectId, signInName, spn. Тестовую службу, к которой объекту предоставляется доступ, можно идентифицировать по URL-адресу scope или сочетанию параметров resource-name, resource-type и resource-group.

В следующем примере Azure CLI показано, как добавить пользователя в роль пользователя DevTest Labs для указанной тестовой службы.

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>

Дальнейшие действия

См. следующие статьи: