Terraform中是否支持循环遍历所有已定义的variable块变量
Terraform遍历所有自定义变量的可行性说明
首先给出明确判断:你期望的「直接通过原生循环语句遍历所有variable块,自动提取每个变量的名称、取值、描述元数据同步到Terraform Cloud」的零配置理想模式,当前Terraform核心运行时能力无法原生落地,但可以通过低侵入的结构调整实现接近的体验,避开你提到的两种旧方案的所有缺陷。
你尝试的示例代码无法运行的核心原因
- Terraform编译阶段处理完所有variable块的元数据(类型、描述、校验规则)后,这些元数据不会传递到运行时的表达式上下文。运行时可访问的全局
var对象,仅包含每个变量的最终配置值,完全不携带对应的key属性、description属性等元信息。 - 你示例代码中写的
for_each = var搭配currentvar.key/currentvar.description的引用逻辑,本身就和运行时的对象结构不匹配:直接遍历var对象时,每个迭代值是变量的实际取值,根本不存在嵌套的key、description字段可供提取,自然无法拿到需要同步的元数据。
可落地的无侵入替代实现
不需要写外部解析脚本、也不需要把所有变量硬编码成嵌套list结构,只需要通过局部值做一次一一映射,就能保留原生Terraform变量的全部能力:
- 保留所有独立的variable块定义,维持原生的类型校验、tfvars配置、验证规则能力,不改变原有变量的编写习惯
- 在同文件内定义和变量一一对应的结构化元数据映射,把每个变量的取值、描述信息统一收拢:
locals { sync_to_tfc_vars = { myfirstvar = { val = var.myfirstvar desc = "a var to upload" } mysecondvar = { val = var.mysecondvar desc = "another var to upload" } } } - 基于这个局部值对象写
tfe_variable资源,完成循环创建:resource "tfe_variable" "test" { for_each = local.sync_to_tfc_vars key = each.key value = each.value.val category = "terraform" workspace_id = tfe_workspace.test.id description = each.value.desc }
方案对比优势
- 完全保留原生variable块的全部能力:每个变量依然有独立的类型校验、tfvars配置入口、敏感标记配置,不需要把所有变量塞成聚合list结构,不存在原方案1的功能缺失问题。
- 没有外部流程依赖:所有配置都在.tf文件内部完成,不需要额外写脚本解析tf文件、tfvars文件,不存在原方案2的流程繁琐、侵入性强的问题。
- 维护成本极低:新增需要同步到TFC的变量时,只需要在
local.sync_to_tfc_vars映射里追加一条对应条目即可,和原有变量的编写流程完全融合。
注:当前Terraform没有提供任何可以自动扫描所有variable块元数据、自动生成上述映射表的原生能力。所有宣称可以做到完全无感知自动同步的实现,本质都是回到外部程序解析tf文件的侵入式路径,没有跳出你提到的两类旧方案的局限。
内容的提问来源于stack exchange,提问作者user2034276
相关产品推荐
相关产品推荐

