我想使用 ADO 管道中所用服务连接的主体 ID 在二头肌中创建一个 roleAssignment。
由于 bicep 中没有 terraform 中的
self
方法,因此我尝试获取所使用的 ARM 服务连接的服务主体 ID。我找到的唯一解决方案是 ADO 管道的以下任务:
- task: AzureCLI@2
displayName: Retrieve principal ID of service connection
continueOnError: false
inputs:
azureSubscription: $(armServiceConnectionName)
scriptType: bash
scriptLocation: inlineScript
addSpnToEnvironment: true
inlineScript: echo "##vso[task.setvariable variable=servicePrincipalId]$servicePrincipalId"
这将返回服务连接的服务主体的应用程序 ID。
是否可以从该应用程序ID中获取主体ID?
我在二头肌中尝试了以下方法,如下所示这里:
armPrincipalId = split(extensionResourceId(armConnectionPrincipalAppId, 'Microsoft.ManagedIdentity/userAssignedIdentities', armServiceConnectionName), '/')[8]
但这会导致以下错误:
DeploymentOutputEvaluationFailed: The template output 'armPrincipalId' is not valid: Unable to evaluate template language function 'extensionResourceId': the provided parent resource id '***' is not a valid uri
这显然不起作用,因为它需要二头肌资源生成的 uri 形状的 ID。但我只有一个UID。
我通过扩展ADO管道任务的inlineScript找到了解决方案:
- task: AzureCLI@2
displayName: Retrieve principal ID of service connection
continueOnError: false
inputs:
azureSubscription: $(armServiceConnectionName)
scriptType: bash
scriptLocation: inlineScript
addSpnToEnvironment: true
inlineScript: echo "##vso[task.setvariable variable=armConnectionPrincipalId]$(az ad sp show --id $servicePrincipalId --query id --out tsv)"
我现在使用 az ad sp show 搜索主体 ID:
az ad sp show --id $servicePrincipalId --query id --out tsv
这仍然是一个很棘手的解决方案。如果有可能在二头肌中使用当前用户主体(无需任何额外的 ADO 任务),请随时在此处发布另一个解决方案。