如何使用 terraform 中的循环概念在虚拟网络内创建子网和 nsg 内的安全规则

Posted

技术标签:

【中文标题】如何使用 terraform 中的循环概念在虚拟网络内创建子网和 nsg 内的安全规则【英文标题】:How to create subnets inside virtual network and security rules inside nsg using loop concept in terraform 【发布时间】:2021-12-09 06:58:11 【问题描述】:

我正在尝试在一个脚本中创建具有多个安全规则的网络安全组,并在一个脚本中创建虚拟网络以及五个子网。

为此,我参考了azurerm_virtual_network 和azurerm_subnet_network_security_group_association 文档。

上述文档包含带有硬编码值的代码。但我想使用循环概念在虚拟网络内创建子网,在网络安全组内创建安全规则,然后将每个子网与网络安全组相关联。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

为了“循环”,您可以使用 for_each = var.value 方法,而不是将值放在 Main.tf 文件中,您可以使用 .tfvars 文件循环遍历资源数。

【讨论】:

【参考方案2】:

由于这是相当先进的,您最好剖析/重用已经可用的东西。看看 Azurerm subnet modules from Claranet,可在 Terraform 网站的模块页面上找到(还有很多东西需要探索!)。以下是在本地定义 nsgs、vnet 和子网的方式,一目了然:

locals 
  network_security_group_names = ["nsg1", "nsg2", "nsg3"]

  vnet_cidr = "10.0.1.0/24"

  subnets = [
    
      name              = "subnet1"
      cidr              = ["10.0.1.0/26"]
      service_endpoints = ["Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ServiceBus", "Microsoft.Web"]
      nsg_name          = local.network_security_group_names[0]
      vnet_name         = module.azure-network-vnet.virtual_network_name

    ,
    
      name              = "subnet2"
      cidr              = ["10.0.1.64/26"]
      service_endpoints = ["Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ServiceBus", "Microsoft.Web"]
      nsg_name          = local.network_security_group_names[2]
      vnet_name         = module.azure-network-vnet.virtual_network_name
    
  ]

【讨论】:

以上是关于如何使用 terraform 中的循环概念在虚拟网络内创建子网和 nsg 内的安全规则的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS 和 Kubernetes 提供商的 Terraform 循环

如何在 terraform 中由 AKS 群集资源创建的虚拟机规模集或负载均衡器上启用诊断日志?

如何使用服务托管标识在 Azure 中使用 Terraform 预配资源

如何自动切换角色策略(Terraform)

使用 terraform 在 for_each 嵌套资源中循环

使用 Terraform 迁移现有基础架构和扩展