You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于时间条件应用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:46:15