#azure #powershell #azure-devops
#azure #powershell #azure-devops
Вопрос:
Я пытаюсь назначить роль веб-приложению после установки назначенного системой управляемого удостоверения. Проблема в том, что она выдает ошибку, если вы назначаете роль сразу после установки управляемого удостоверения.
2019-04-04T07:57:12.9852397Z ##[error]Principal 438350e59xxxxxxxxxx935e5c135 does not exist in the directory ***.
Поэтому я добавил код повторной попытки, чтобы попытаться назначить роль, пока не будет доступен участник.
$webappname = "devt002"
$resourcegroup = "devt002RG"
$roleDefinitionName = "Storage Blob Data Contributor"
#Set the system assigned managed identity
Set-AzureRmWebApp -AssignIdentity $true -ResourceGroupName "$resourcegroup" -Name "$webappname"
#Get webapp object id
$webapp = Get-AzureRmWebApp -ResourceGroupName "$resourcegroup" -Name "$webappname"
$objectid = [System.Guid]::Parse($webapp.Identity.PrincipalId)
write-host "Object ID :" $objectid
#Get resource id (Scope) for storage account
$webapp2 = Get-AzureRmResource -ResourceGroupName "$resourcegroup" -Name "$webappname" -ResourceType "Microsoft.Storage/storageAccounts"
$resid = $webapp2.ResourceId.ToString()
write-host "Resource ID :" $resid
#Get Assign role if already exist
$roles = Get-AzureRmRoleAssignment -ObjectId "$objectid"
write-host "Already Assigned Roles :" $roles.RoleDefinitionName
if($roles.RoleDefinitionName -Match "Storage Blob Data Contributor")
{
Write-Host "Storage Blob Data Contributor role already exist !!!"
}
else
{
#Assign role to web app (Object id)
$retryCount = 5
$totalRetries = $retryCount
While ($True)
{
Try
{
$Null = New-AzureRmRoleAssignment -ObjectId $objectid -RoleDefinitionName "$roleDefinitionName" -Scope "$resid"
Write-Host "Storage Blob Data Contributor role assign successfully !!!"
Return
}
Catch
{
# The principal could not be found. Maybe it was just created.
If ($retryCount -eq 0)
{
Write-Error "An error occurred: $($_.Exception)`n$($_.ScriptStackTrace)"
throw "The principal '$objectId' cannot be granted '$roleDefinitionName' role on the web app '$webappname'. Please make sure the principal exists and try again later."
}
$retryCount--
Write-Warning " The principal '$objectId' cannot be granted '$roleDefinitionName' role on the web app '$webappname'. Trying again (attempt $($totalRetries - $retryCount)/$totalRetries)"
Start-Sleep 10
}
}
}
но на этот раз произошла ошибка ниже. Странно то, что роль назначена веб-приложению.
2019-04-04T10:00:58.8423494Z Object ID : 31d52967-xxxx-xxxx-xxxx-b3944da09ab2
2019-04-04T10:01:02.6524758Z Resource ID : /subscriptions/4364666b-xxxx-xxxx-xxxx-47158904c439/resourceGroups/devt002RG/providers/Microsoft.Storage/storageAccounts/devt002
2019-04-04T10:01:04.2157521Z Already Assigned Roles :
2019-04-04T10:01:14.1407666Z ##[warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 1/5)
2019-04-04T10:01:14.1417125Z ##[debug]Processed: ##vso[task.logissue type=warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 1/5)
2019-04-04T10:01:25.7075458Z ##[warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 2/5)
2019-04-04T10:01:25.7076201Z ##[debug]Processed: ##vso[task.logissue type=warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 2/5)
2019-04-04T10:01:37.5640393Z ##[warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 3/5)
2019-04-04T10:01:37.5640997Z ##[debug]Processed: ##vso[task.logissue type=warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 3/5)
2019-04-04T10:01:50.5967259Z ##[warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 4/5)
2019-04-04T10:01:50.5967755Z ##[debug]Processed: ##vso[task.logissue type=warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 4/5)
2019-04-04T10:02:02.7386688Z ##[warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 5/5)
2019-04-04T10:02:02.7387138Z ##[debug]Processed: ##vso[task.logissue type=warning] The principal '31d52967-xxxx-xxxx-xxxx-b3944da09ab2' cannot be granted 'Storage Blob Data Contributor' role on the web app 'devt002'. Trying again (attempt 5/5)
2019-04-04T10:02:16.4259863Z ##[error]An error occurred: Microsoft.Rest.Azure.CloudException: The role assignment already exists.
Ответ №1:
что он пытается вам сказать — эквивалентное назначение роли существует с другим именем, и вы не можете дважды назначить одно и то же назначение под разными именами.
Итак, я думаю, вопрос в том, почему вам нужно дважды назначать одно и то же разрешение под другим именем
Комментарии:
1. Перед запуском этого кода я удостоверяюсь, что веб-приложению не назначена роль и управляемое удостоверение также не установлено. Этот код устанавливает управляемый идентификатор, а затем назначает роль. По моему мнению, после назначения роли должно отображаться сообщение об успешном завершении и выйти из цикла.
2. У меня нет времени просматривать ваш код сейчас, могу сделать это только вечером, но вот что означает эта ошибка
3. Я могу заверить вас, что роль уже отсутствует. Этот код присваивает роль. Проблема заключается в логике повторных попыток. Он просто не выходит из цикла в нужное время после выполнения своей работы. 🙂
Ответ №2:
Я думаю, что должно быть что-то, чтобы убедиться в назначении роли. Для одной и той же области или ресурса вы можете назначить одну и ту же роль участнику службы только один раз. В данном случае это означает, что вы можете назначить роль «Поставщик данных большого двоичного объекта хранилища» учетной записи хранилища своему удостоверению приложения только один раз.
Поэтому, когда вы проверяете, существует ли назначение роли, вам может потребоваться только проверить, является ли результат команды PowerShell нулевым или нет.
Get-AzureRmRoleAssignment -ObjectId "$objectid" -RoleDefinitionName "$roleDefinitionName" -Scope "$resid"
И я думаю, что цикл while не подходит. Если назначение роли может быть создано успешно, то для этого достаточно одного раза. Более одного раза не имеет смысла. Поэтому вам просто нужно проверить, прошло ли это успешно. Если нет, то в чем причина.
Обновить
Из вашего сценария PowerShell я обнаружил, что вы используете приведенную ниже команду для получения идентификатора веб-приложения:
$objectid = [System.Guid]::Parse($webapp.Identity.PrincipalId)
Это неправильно. Вы просто можете получить результат объекта, а не только идентификатор. Вот так:
Два способа получить только идентификатор.
Один: $webapp.Identity.PrincipalId
Два: $objectid.Guid
Я предлагаю первый способ, затем вы можете удалить команду $objectid = [System.Guid]::Parse($webapp.Identity.PrincipalId)
.
Согласно вашему комментарию, для выполнения операции, которая включает управляемую идентификацию веб-приложения, потребуется некоторое время. Лучше немного подождать перед созданием назначения роли, чем использовать цикл while. Недолго, достаточно просто подождать 30 секунд.
Комментарии:
1. При первом запуске этого скрипта результатом всегда будет null. Но проблема в том, что управляемая идентификация недоступна мгновенно. Это основная причина, по которой цикл while вызывается 5 раз.
2. Спасибо за совет. Вы понимаете мою проблему?
3. @rAJ Если вы имеете в виду, что вы не можете создать назначение роли, поэтому запускаете его пять раз?
4. Позвольте мне объяснить это подробно. Изначально нет управляемого удостоверения и назначения роли. Я запускаю скрипт, и он создает новую управляемую идентификацию. При запуске кода назначения роли произойдет сбой, поскольку управляемая идентификация не активируется мгновенно. Это занимает некоторое время (вероятно, 30-40 секунд). Поэтому я добавил цикл while, который пытается назначить роль с интервалом в 10 секунд. Итак, я ожидаю, что в 3-м или 4-м цикле он должен создать роль и выйти из цикла. Каким-то образом, когда выполняется цикл, он создает роль и не может выйти. После завершения работы счетчика 5 выдает ошибку, что роль уже существует и прерывается. Проблема в цикле while
5. @rAJ Хорошо, я понял вашу цель. Но почему бы вам просто не поспать некоторое время, прежде чем создавать назначение роли? Это более просто и полезно.