如何复用Terraform locals.tf中的镜像版本至descriptor.json(避免硬编码)
如何复用Terraform locals中的镜像版本到descriptor.json?
你目前的场景是多个Terraform模块的locals.tf里维护镜像版本,需要同步到descriptor.json,避免硬编码重复。首先明确:静态的descriptor.json本身不支持直接引用Terraform变量,得通过Terraform的文件生成能力来实现版本同步,下面是两种可行方案:
方案1:用模板文件生成descriptor.json
把descriptor做成模板,用Terraform渲染填充变量:
- 创建模板文件
descriptor.tpl.json,使用Terraform插值语法占位:
{ "service": "xyz", "external-resources": { "images": [ { "name": "${local.xyz_image}", "version": "${local.xyz_image_version}" } ] } }
- 在
main.tf中添加资源,读取locals值并生成最终的JSON文件:
resource "local_file" "descriptor_json" { content = templatefile("${path.module}/descriptor.tpl.json", { xyz_image = local.xyz_image xyz_image_version = local.xyz_image_version }) filename = "${path.module}/descriptor.json" }
每次执行terraform apply时,Terraform会自动根据locals里的最新值更新descriptor.json,保证版本一致。
方案2:直接用jsonencode构造并生成文件
如果不想维护模板文件,可直接在Terraform中构造JSON结构,再写入文件:
resource "local_file" "descriptor_json" { content = jsonencode({ "service" = "xyz", "external-resources" = { "images" = [ { "name" = local.xyz_image, "version" = local.xyz_image_version } ] } }) filename = "${path.module}/descriptor.json" }
这种方式更紧凑,适合JSON结构简单的场景。
注意点
- 只有执行
terraform apply后,descriptor.json才会更新,修改locals版本后记得运行apply同步。 - 不要手动修改生成的
descriptor.json,否则下次apply会覆盖你的手动修改。 - 多模块场景可以把生成JSON的逻辑封装成公共Terraform模块,减少重复代码。
内容的提问来源于stack exchange,提问作者buttercup
相关产品推荐
相关产品推荐

