local-exec 中的 Powershell(Azure DevOps 管道)

Powershell in local-exec (Azure DevOps Pipelines)

我正在使用 Azure DevOps Pipeline 部署基础结构。 Terraform 模块之一使用 local-exec,它是一个启用 VM SQL 备份的 Powershell 脚本。当我以用户身份连接到 Azure 时,我的 PC 在本地一切正常。该问题仅出现在我通过服务主体连接到 Azure 的管道中。我使用内置的 Powershell 只是为了 运行 Connect-AzAccount 希望在所有任务期间都能保持连接。不幸的是,当涉及到 Terraform Apply 时,在我的模块部署期间,出现错误:

请提供有效的租户或有效的订阅。

找不到资源组 'abcd'。

有人知道如何在所有任务期间保持与 Azure 的连接吗?我什至尝试在模块中 运行 Set-AzContext -SubscriptionId "xxxx-xxxx-xxxx-xxxx" 但它找不到我的订阅。

这是 Powershell 任务的样子:

$AzureAADClientKey = "***"
$AzureTenantID = " xxxx-xxxx-xxxx-xxxx "
$AzureSubscriptionName = " xxxx-xxxx-xxxx-xxxx "
$AzureEnv = "AzureCloud"
#Start Connection
$securePassword = ConvertTo-SecureString $AzureAADClientKey -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $AzureAADClientID,$securePassword
$n = Disable-AzContextAutosave -Scope Process
Clear-AzContext -Scope Process
Connect-AzAccount -Credential $credential -TenantId $AzureTenantID -Environment $AzureEnv -ServicePrincipal -SubscriptionId $AzureSubscriptionName

感谢任何帮助!

试试下面的示例任务,它对我有用。

# Prepare the Postgres admin password
- task: AzurePowerShell@4
  inputs:
    azureSubscription: '$(subscription)'
    ScriptType: 'FilePath'
    ScriptPath: 'Scripts/PreparePostgresAdminPassword.ps1'
    ScriptArguments: '-ResourceGroupName $(rgName) -KeyVaultName $(kvName) -SecretName $(secretName)'
    errorActionPreference: 'silentlyContinue'
    azurePowerShellVersion: 'LatestVersion'
    timeoutInMinutes: 2

最终我设法用另一种方式做到了。我使用 Bash 任务到 运行 'Terraform Apply',它包含三个命令 - Set-AzContext、az account set 和 terraform apply。谢谢你们的帮助,伙计们!

      - bash: |          
          echo "##vso[task.setvariable variable=AZURE_CLIENT_ID;issecret=true]$(client_id)"
          echo "##vso[task.setvariable variable=AZURE_CLIENT_SECRET;issecret=true]$(client_secret)"
          echo "##vso[task.setvariable variable=AZURE_SUBSCRIPTION_ID]$(subscription_id)"
          echo "##vso[task.setvariable variable=AZURE_TENANT_ID;issecret=true]$(tenant_id)" 
        workingDirectory: '$(Build.ArtifactStagingDirectory)/${{parameters.tfExecutionDir}}'
        displayName: 'Set environment variables for Service Principal authentication'

        
      - bash: |
          pwsh -c "Set-AzContext -SubscriptionId "$(AZURE_SUBSCRIPTION_ID)" -Tenant "$(AZURE_TENANT_ID)""
          az account set --subscription "$(AZURE_SUBSCRIPTION_ID)"

          terraform apply $(Build.BuildNumber).tfplan
        workingDirectory: '$(Build.ArtifactStagingDirectory)/${{parameters.tfExecutionDir}}'
        displayName: 'Terraform Apply'
        env:
          ARM_CLIENT_ID: $(AZURE_CLIENT_ID)
          ARM_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
          ARM_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
          ARM_TENANT_ID: $(AZURE_TENANT_ID)