如何基于时间条件应用Terraform中的映射组变量?
问题描述
原本向模块传入单个映射的示例:
some_map = { version = "v2" var1 = 1 var2 = 2 }
现在希望将变量分组为映射列表,并根据时间应用对应分组的变量,示例如下:
groups = [ { version = "v2" var1 = 1 var2 = 2 timeslot = "monday - friday" // 格式仅作示例,实际可使用标准日期格式 }, { version = "v2" var1 = 1 var2 = 2 timeslot = "saturday - sunday" // 格式仅作示例 } ]
在Terraform文档中未找到原生实现该需求的方法,怀疑原生不支持,想询问如果确实如此,该如何模拟此逻辑?
模拟实现方案
Terraform本身没有原生的时间驱动配置切换功能,因为它是声明式的基础设施即代码工具,执行时的状态基于当前配置而非动态时间触发。不过可以通过以下几种方式模拟按时间应用变量的逻辑:
1. 外部数据源+筛选表达式实现自动匹配
借助external数据源调用脚本获取当前时间对应的时段,再从groups列表中筛选出匹配的分组作为模块输入:
步骤示例:
- 编写Shell脚本(比如
get_timeslot.sh),输出当前所属时段标识:
#!/bin/bash day=$(date +%u) if [ $day -ge 1 ] && [ $day -le 5 ]; then echo '{"slot": "weekday"}' else echo '{"slot": "weekend"}' fi
- 在Terraform中配置
external数据源调用该脚本:
data "external" "current_slot" { program = ["./get_timeslot.sh"] }
- 调整
groups结构,给每个分组添加明确的时段标识,再用for表达式筛选匹配项:
variable "groups" { type = list(object({ version = string var1 = number var2 = number slot = string })) default = [ { version = "v2" var1 = 1 var2 = 2 slot = "weekday" }, { version = "v2" var1 = 3 var2 = 4 slot = "weekend" } ] } locals { selected_group = one([ for g in var.groups : g if g.slot == data.external.current_slot.result.slot ]) }
- 向模块传入筛选后的分组:
module "example" { source = "./path/to/module" some_map = local.selected_group }
2. 工作区切换实现手动时段配置
如果不需要自动触发,可创建不同工作区对应不同时段,切换工作区时加载对应配置:
步骤示例:
- 创建工作区:
terraform workspace new weekday terraform workspace new weekend
- 在
weekday工作区的terraform.tfvars中配置:
some_map = { version = "v2" var1 = 1 var2 = 2 }
- 在
weekend工作区的terraform.tfvars中配置:
some_map = { version = "v2" var1 = 3 var2 = 4 }
- 切换工作区并执行:
terraform workspace select weekend terraform apply
3. 变量输入手动指定时段
如果不需要自动判断时间,可通过命令行输入变量指定要使用的分组:
步骤示例:
- 定义时段变量:
variable "target_slot" { type = string default = "weekday" description = "指定要使用的时段,可选值:weekday/weekend" }
- 筛选对应分组:
locals { selected_group = one([ for g in var.groups : g if g.slot == var.target_slot ]) }
- 执行时指定变量:
terraform apply -var="target_slot=weekend"
内容的提问来源于stack exchange,提问作者DISCO
相关产品推荐
相关产品推荐

