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

如何让Terraform与Bash共用外部非.tfvars配置文件?

实现Terraform与Bash共用外部配置文件的方案

这问题我之前也碰到过,刚好可以通过Terraform的字符串解析功能结合已有的local_file数据源来解决,既能让Bash直接使用你的config.txt,又能让Terraform从中提取所需变量,完全不用依赖.tfvars文件。具体操作如下:

一、Bash端直接使用配置文件

这个很简单,在Bash脚本里直接source配置文件就能加载变量:

# 加载配置文件中的环境变量
source ./config.txt

# 测试使用变量
echo "当前项目ID: $GOOGLE_PROJECT_ID"
echo "当前区域: $GOOGLE_REGION"

二、Terraform端解析配置文件提取变量

你已经有了local_file数据源读取config.txt,接下来只需要用Terraform的正则表达式函数提取对应变量值即可。推荐用locals块统一管理解析后的变量,这样代码更清晰:

修改datasources.tf,添加变量解析逻辑

在现有local_file数据源下方添加locals块:

data "local_file" "local_config_file" {
  filename = "./config.txt"
}

locals {
  # 解析GOOGLE_PROJECT_ID的值,匹配单引号内的内容
  project_id = regex("GOOGLE_PROJECT_ID='([^']+)'", data.local_file.local_config_file.content)[0]
  
  # 解析GOOGLE_REGION,若配置文件中未定义则使用变量的默认值
  region = can(regex("GOOGLE_REGION='([^']+)'", data.local_file.local_config_file.content)) ? 
           regex("GOOGLE_REGION='([^']+)'", data.local_file.local_config_file.content)[0] : 
           var.region
}

在Terraform资源中使用解析后的变量

之后你在任何需要用到项目ID或区域的地方,直接引用local.project_id和local.region即可,比如:

# 示例:创建GCS存储桶
resource "google_storage_bucket" "example" {
  name          = "${local.project_id}-example-bucket"
  location      = local.region
  force_destroy = true
}

关于变量默认值的说明

如果config.txt中没有定义GOOGLE_REGION,Terraform会自动回退到variables.tf里var.region的默认值europe-west3,用can()函数可以避免正则匹配失败导致的报错,让配置更健壮。

三、验证方案有效性

  1. 先在Bash中测试:执行source config.txt && echo $GOOGLE_PROJECT_ID,能输出正确的项目ID说明Bash端没问题。
  2. Terraform端测试:执行terraform init && terraform plan,查看输出中是否正确加载了config.txt里的变量值。

这样就完美实现了同一个配置文件同时给Terraform和Bash使用的需求,不用再维护两份配置啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:57:39