如何在Terraform中基于输入变量动态创建多个独立资源
Terraform for_each 与 dynamic 适用场景解答
首先给明确结论:不能用dynamic块在资源外部实现独立资源的批量创建需求,两种语法的适用场景完全不重叠,具体说明如下:
dynamic块的定位是处理单资源内部的重复嵌套配置段,只能写在资源/数据源/provider等块的内部,不能放在资源块外层,也不具备生成多个独立资源实例的能力。它的典型使用场景是生成同个资源里的多个重复嵌套参数,比如安全组的出入站规则块、存储账号的网络规则块等。- 你当前用资源根层级
for_each批量创建独立azurerm_mssql_firewall_rule的方案,是Terraform官方推荐的标准实现,完全符合最佳实践。
如果你需要基于set类型的输入变量实现同样的批量创建逻辑,只需要在for_each处做个简单的类型转换即可,参考实现如下:
# 子模块变量定义改为set类型 variable "azureSQLAllowedIPs" { type = set(object({ name = string ipAddress = string })) } # 资源侧将set转换为map,用规则名作为唯一索引键避免实例重复 resource "azurerm_mssql_firewall_rule" "azureSQLFirewall"{ for_each = { for ip_rule in var.azureSQLAllowedIPs : ip_rule.name => ip_rule } name = each.value.name server_id = azurerm_mssql_server.azureSqlServer.id start_ip_address = each.value.ipAddress end_ip_address = each.value.ipAddress }
附dynamic块的典型使用示例,方便你对比两者差异:
resource "azurerm_mssql_server" "example" { name = "demo-sql-server" resource_group_name = azurerm_resource_group.demo.name location = azurerm_resource_group.demo.location version = "12.0" administrator_login = "admin" administrator_login_password = "TestPassw0rd!" # 动态生成资源内部的多个azuread_administrator嵌套配置块 dynamic "azuread_administrator" { for_each = var.sql_ad_admin_list content { login_username = azuread_administrator.value.login_name object_id = azuread_administrator.value.object_id tenant_id = data.azurerm_client_config.current.tenant_id } } }
内容的提问来源于stack exchange,提问作者NitrusCS
相关产品推荐
相关产品推荐

