Terraform部署Databricks实例添加ADO审批网关报错咨询
原本有一段可成功通过Terraform将Databricks实例部署至Azure的Azure DevOps YAML流水线代码:
pool: vmImage: 'ubuntu-latest' variables: - group: terraform-databricks-test steps: - task: TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: 'latest' - checkout: self displayName: 'Checkout repository' - task: TerraformTaskV4@0 displayName: 'Terraform Init' inputs: command: 'init' workingDirectory: '$(Build.SourcesDirectory)/terraform' backendType: 'azurerm' ensureBackend: true backendServiceArm: 'test-SPN' backendAzureRmResourceGroupName: 'test-group' backendAzureRmStorageAccountName: 'accountName' backendAzureRmContainerName: 'containerName' backendAzureRmKey: 'terraform.tfstate' - task: TerraformTaskV3@3 displayName: 'Terraform Validate' inputs: command: 'validate' workingDirectory: '$(Build.SourcesDirectory)' - task: TerraformTaskV3@3 displayName: 'Terraform Plan' inputs: command: 'plan' workingDirectory: '$(Build.SourcesDirectory)/terraform' environmentServiceNameAzureRM: 'test-SPN' - task: TerraformTaskV3@3 displayName: 'Terraform Apply' inputs: command: 'apply' workingDirectory: '$(Build.SourcesDirectory)/terraform' environmentServiceNameAzureRM: 'test-SPN'
为添加审批网关(Plan执行后需人工审批才能执行Apply),修改后的YAML在第一个阶段执行成功后,第二个阶段报错:
There was an error when attempting to execute the process '/opt/hostedtoolcache/terraform/1.6.5/x64/terraform'. This may indicate the process failed to start. Error: spawn /opt/hostedtoolcache/terraform/1.6.5/x64/terraform ENOENT
修改后的代码:
pool: vmImage: 'ubuntu-latest' variables: - group: terraform-databricks stages: - stage: PlanAndValidate jobs: - job: PlanAndValidate steps: - task: TerraformInstaller@0 displayName: 'Install Terraform' - task: TerraformTaskV4@0 displayName: 'Terraform Init' inputs: command: 'init' workingDirectory: '$(Build.SourcesDirectory)/terraform' backendType: 'azurerm' ensureBackend: true backendServiceArm: 'test-SPN' backendAzureRmResourceGroupName: 'test-group' backendAzureRmStorageAccountName: 'accountName' backendAzureRmContainerName: 'containerName' backendAzureRmKey: 'terraform.tfstate' - task: TerraformTaskV3@3 displayName: 'Terraform Validate' inputs: command: 'validate' workingDirectory: '$(Build.SourcesDirectory)' - task: TerraformTaskV3@3 displayName: 'Terraform Plan' inputs: command: 'plan' workingDirectory: '$(Build.SourcesDirectory)/terraform' environmentServiceNameAzureRM: 'test-SPN' - stage: Apply jobs: - deployment: Apply displayName: 'Terraform Apply' environment: databricks-env strategy: runOnce: deploy: steps: - task: TerraformInstaller@0 displayName: 'Install Terraform' - task: TerraformTaskV3@3 displayName: 'Terraform apply' inputs: command: 'apply' workingDirectory: '$(Build.SourcesDirectory)/terraform' environmentServiceNameAzureRM: 'test-SPN'
有两个疑问:
- 尝试移除
strategy和runOnce关键字后,无法使用environment,是否environment必须依赖这些关键字? - 报错是否因路径问题导致Terraform文件未找到?若如此,该如何设置Apply阶段的路径?
1. 关于environment与strategy的依赖关系
是的,在Azure DevOps中,如果把environment用在deployment类型的job里,必须配合部署策略(strategy)。
原因是:deployment job是Azure DevOps专门为部署场景设计的job类型,它强制要求指定部署策略(比如runOnce、canary、rolling等),而environment是deployment job的核心配置项之一,用于关联审批规则、环境资源等。
如果不想用strategy,也可以用普通job类型配合environment:需要先在Azure DevOps的环境设置里手动配置审批规则,然后在普通job中添加environment: databricks-env即可,但这种方式的集成度不如deployment job,官方更推荐用deployment job实现带审批的部署流程。
2. 报错原因与解决方法
报错ENOENT主要由两个问题导致:
- Apply阶段未拉取代码仓库:
deploymentjob默认不会自动执行checkout操作,导致Terraform配置文件找不到,同时Terraform安装后也无法定位到配置文件路径。 - Terraform安装未指定版本:原代码中
TerraformInstaller@0没有设置terraformVersion,可能导致安装的版本与Plan阶段不一致,甚至安装失败。
修正后的Apply阶段配置
- stage: Apply jobs: - deployment: Apply displayName: 'Terraform Apply' environment: databricks-env strategy: runOnce: deploy: steps: - checkout: self displayName: 'Checkout repository' - task: TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: 'latest' # 指定版本,与Plan阶段保持一致 - task: TerraformTaskV3@3 displayName: 'Terraform apply' inputs: command: 'apply' workingDirectory: '$(Build.SourcesDirectory)/terraform' environmentServiceNameAzureRM: 'test-SPN'
关键修正点:
- 添加
checkout: self步骤,确保Apply阶段能拉取到代码仓库中的Terraform配置文件。 - 给
TerraformInstaller@0指定terraformVersion: 'latest',与Plan阶段保持版本一致,避免兼容性问题。 - 修正原代码的缩进错误:原Apply阶段的
environment和strategy缩进层级错误,导致YAML语法解析失败,这也是报错的潜在原因之一。
内容的提问来源于stack exchange,提问作者abautista

