如何让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()函数可以避免正则匹配失败导致的报错,让配置更健壮。
三、验证方案有效性
- 先在Bash中测试:执行
source config.txt && echo $GOOGLE_PROJECT_ID,能输出正确的项目ID说明Bash端没问题。 - Terraform端测试:执行
terraform init && terraform plan,查看输出中是否正确加载了config.txt里的变量值。
这样就完美实现了同一个配置文件同时给Terraform和Bash使用的需求,不用再维护两份配置啦!
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

