You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

有两个疑问:

  1. 尝试移除strategy和runOnce关键字后,无法使用environment,是否environment必须依赖这些关键字?
  2. 报错是否因路径问题导致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阶段未拉取代码仓库:deployment job默认不会自动执行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'

关键修正点:

  1. 添加checkout: self步骤,确保Apply阶段能拉取到代码仓库中的Terraform配置文件。
  2. 给TerraformInstaller@0指定terraformVersion: 'latest',与Plan阶段保持版本一致,避免兼容性问题。
  3. 修正原代码的缩进错误:原Apply阶段的environment和strategy缩进层级错误,导致YAML语法解析失败,这也是报错的潜在原因之一。

内容的提问来源于stack exchange,提问作者abautista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:08:13