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
相关产品推荐
相关产品推荐

