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

Terraform模块调用中如何为指定域名条件化设置参数?

Terraform 条件化设置模块参数方案

根据你的需求,分三种常见场景给出解决方案:

场景1:模块管理所有域名,参数为全局布尔值

如果你的模块接收整个域名列表,desired_argument 是一个全局布尔值(表示列表中是否包含 123.com),直接用 contains 函数判断即可:

module "dns_zones" {
  providers              = { my.provider }
  count                  = contains(["production", "test"], var.environment_type) ? 1 : 0
  source                 = "../my-modules"
  private_dns_zone_names = var.dns_zone_names
  resource_group_name    = var.name
  desired_argument       = contains(var.dns_zone_names, "123.com") # 存在则为true,否则false
}

场景2:每个域名对应一个模块实例

如果需要为每个域名单独创建模块实例,并仅对 123.com 设置特定参数,需调整模块的 count 并逐个判断:

module "dns_zones" {
  providers              = { my.provider }
  # 仅在指定环境下,为每个域名创建一个实例
  count                  = contains(["production", "test"], var.environment_type) ? length(var.dns_zone_names) : 0
  source                 = "../my-modules"
  # 传递单个域名给模块(需确保模块参数支持单个值而非列表)
  private_dns_zone_name  = var.dns_zone_names[count.index]
  resource_group_name    = var.name
  # 当前实例对应域名是123.com时设为true,否则false
  desired_argument       = var.dns_zone_names[count.index] == "123.com"
}

场景3:参数为与域名列表对应的布尔列表

如果模块需要接收与域名列表一一对应的布尔值列表(每个域名对应一个布尔状态),用 for 表达式生成:

module "dns_zones" {
  providers              = { my.provider }
  count                  = contains(["production", "test"], var.environment_type) ? 1 : 0
  source                 = "../my-modules"
  private_dns_zone_names = var.dns_zone_names
  resource_group_name    = var.name
  # 生成布尔列表,与域名列表位置对应
  desired_argument       = [for zone in var.dns_zone_names : zone == "123.com"]
}

注意事项

  • 选择哪种方案取决于你的模块参数定义:如果模块接收单个域名,用场景2;如果接收列表且需要全局状态,用场景1;如果需要每个域名对应单独的参数状态,用场景3。
  • 确保 .tfvars 里的域名列表格式正确,每个域名需要加引号:
    dns_zone_names = [
      "abc.com",
      "123.com",
      "xyz.com"
    ]
    

内容的提问来源于stack exchange,提问作者mxmxx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:37:39