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

Terraform如何跨目录访问不同路径下的文件与变量?

现有环境目录结构

当前Linux系统下的目录结构如下:

/root
  ├─dirA
  │  ├─main.tf
  │  ├─terraform.tfvars
  │  └─variables.tf
  └─dirB
     └─main.tf

问题一:dirB中访问dirA生成的kubeconfig文件

首先明确:dirA中原有配置用相对路径./kubeconfig生成文件,实际存放路径是dirA的工作目录,对应绝对路径为/root/dirA/kubeconfig。根据两个目录的Terraform使用关系,有两种标准实现方式:

  • 若dirB作为子模块和dirA统一编排(推荐方案)
    1. 先修改dirA的配置,固定kubeconfig路径为模块绝对路径,避免执行目录变化导致文件落点异常,同时对外暴露输出值:
      可以在dirA下新建outputs.tf,也可以直接把以下内容追加到dirA/main.tf末尾:
      # 修正kubeconfig生成路径,绑定当前模块目录
      resource "local_file" "kubeconfig" {
        content  = module.gke_auth.kubeconfig_raw
        filename = "${path.module}/kubeconfig"
      }
      
      # 输出kubeconfig绝对路径供外部引用
      output "kubeconfig_abs_path" {
        value = local_file.kubeconfig.filename
      }
      
    2. 修改dirB/main.tf,通过模块引用关联dirA配置,直接传入kubeconfig路径:
      # 引入dirA的Terraform配置
      module "cluster_base" {
        source = "../dirA"
      }
      
      provider "kubernetes" {
        config_path = module.cluster_base.kubeconfig_abs_path
      }
      
  • 若dirA和dirB是完全独立的两个Terraform项目
    直接在provider配置中填写kubeconfig的绝对路径即可:
    provider "kubernetes" {
      config_path = "/root/dirA/kubeconfig"
    }
    

    注意:该方式必须先在dirA目录下执行完terraform apply,确保kubeconfig文件已经生成,否则dirB初始化kubernetes provider时会直接报文件不存在错误。


问题二:dirB中访问dirA的terraform.tfvars定义的变量

Terraform原生不支持跨目录直接加载其他项目的tfvars文件,同样根据两个目录的使用关系选择对应方案:

  • 若dirB作为子模块和dirA统一编排
    直接在dirA的output配置中把需要对外暴露的变量值输出,dirB通过模块引用即可读取,逻辑和问题一引用kubeconfig路径完全一致。示例:
    在dirA的output块中添加要暴露的变量:
    output "cluster_region" {
      value = var.cluster_region # var.cluster_region即为dirA terraform.tfvars中定义的变量
    }
    
    在dirB中通过module.cluster_base.cluster_region即可读取到对应变量值。
  • 若dirA和dirB是完全独立的两个Terraform项目
    二选一即可:
    1. 公共变量抽离:把两个项目共用的变量提取到独立的公共变量文件(比如/root/common.tfvars),两个目录执行Terraform命令时都通过-var-file参数加载该公共文件:
      # dirA执行命令
      terraform apply -var-file=../common.tfvars
      # dirB执行命令
      terraform apply -var-file=../common.tfvars
      
    2. 远程状态读取:在dirB中通过terraform_remote_state数据源读取dirA的状态文件,从状态输出中获取需要的变量值。示例(本地backend场景):
      data "terraform_remote_state" "dirA_state" {
        backend = "local"
        config = {
          path = "../dirA/terraform.tfstate"
        }
      }
      
      # 读取dirA输出的变量值
      locals {
        cluster_region = data.terraform_remote_state.dirA_state.outputs.cluster_region
      }
      

      注意:该方式同样要求dirA先把需要共享的变量配置为output输出,否则无法从状态文件中读取到对应值。

避坑提示:不要尝试在dirB中用文件读取函数手动解析dirA的terraform.tfvars内容,tfvars是Terraform专属的变量加载格式,手动解析会遇到类型转换、语法兼容等不可预期的问题,不属于官方推荐的实现方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:57:17