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)
我正在使用 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)