Terraform配置Nomad变量:多命名空间与Map变量迭代问题
解决Terraform配置Nomad变量的问题
错误原因
你遇到的错误是因为错误地尝试访问map类型变量的.key和.values属性——Terraform的map类型并没有这些内置属性。var.job_varaible本身就是一个完整的键值对map,直接引用或通过for表达式遍历即可。
解决方案
根据你的需求(为所有命名空间设置对应的变量),提供两种实现方式:
方式一:每个命名空间创建一个包含所有job变量的变量集
如果希望每个命名空间对应一个包含所有job变量的Nomad变量资源,直接将整个var.job_varaible赋值给items即可,同时注意保证path的唯一性:
resource "nomad_variable" "test" { path = "nomad/jobs/${each.value}" # 为每个命名空间生成唯一path for_each = toset(var.namespace_vars) namespace = each.value items = var.job_varaible # 直接使用完整的map作为变量内容 }
方式二:每个命名空间的每个job变量单独创建资源(嵌套遍历)
如果需要将每个job变量单独作为一个Nomad变量资源在各个命名空间下创建,可以使用嵌套for表达式生成复合键来实现嵌套遍历:
resource "nomad_variable" "test" { path = "nomad/jobs/${each.value.namespace}/${each.value.var_key}" for_each = { # 嵌套遍历命名空间和job变量,生成唯一的复合键 for ns in var.namespace_vars: for k in keys(var.job_varaible): "${ns}-${k}" => { namespace = ns var_key = k var_value = var.job_varaible[k] } } namespace = each.value.namespace items = { each.value.var_key = each.value.var_value } }
说明
- 方式一适合批量将一组变量应用到多个命名空间,资源数量与命名空间数量一致;
- 方式二适合需要对单个变量进行精细化管理的场景,资源数量为
命名空间数量 × job变量数量。
内容的提问来源于stack exchange,提问作者Stoyan Prokopov
相关产品推荐
相关产品推荐

