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统一编排(推荐方案)
- 先修改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 } - 修改dirB/main.tf,通过模块引用关联dirA配置,直接传入kubeconfig路径:
# 引入dirA的Terraform配置 module "cluster_base" { source = "../dirA" } provider "kubernetes" { config_path = module.cluster_base.kubeconfig_abs_path }
- 先修改dirA的配置,固定kubeconfig路径为模块绝对路径,避免执行目录变化导致文件落点异常,同时对外暴露输出值:
- 若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块中添加要暴露的变量:
在dirB中通过output "cluster_region" { value = var.cluster_region # var.cluster_region即为dirA terraform.tfvars中定义的变量 }module.cluster_base.cluster_region即可读取到对应变量值。 - 若dirA和dirB是完全独立的两个Terraform项目
二选一即可:- 公共变量抽离:把两个项目共用的变量提取到独立的公共变量文件(比如
/root/common.tfvars),两个目录执行Terraform命令时都通过-var-file参数加载该公共文件:# dirA执行命令 terraform apply -var-file=../common.tfvars # dirB执行命令 terraform apply -var-file=../common.tfvars - 远程状态读取:在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
相关产品推荐
相关产品推荐

