Как удалить элемент декартова произведения двух списков в Terraform? - PullRequest
1 голос
/ 06 мая 2020

Я хотел бы создать набор правил сетевой безопасности (nsg) в Azure между разными подсетями с помощью Terraform. Для этой цели я написал следующий код:

#here, a set of subnets are created according to the value of count. 
resource "azurerm_subnet" "mysubnets" {
    count = var.subnet_number
    name = join("-", ["subnet", count.index])
    resource_group_name = var.rgname
    virtual_network_name = azurerm_virtual_network.Global_VNet.name
    address_prefix = join(".", ["10.0", "${count.index}", "0/24"])
}

product ниже создается переменная для создания правила nsg с парами su bnet. Это позволяет перебирать пару подсетей. Я получаю address_prefixes внутри объявления ресурса azurerm_network_security_rule

locals {
  product = "${setproduct(azurerm_subnet.mysubnets, azurerm_subnet.mysubnets)}"
}

resource "azurerm_network_security_rule" "myNSGrule" {
      count                       = var.subnet_number * var.subnet_number
      source_address_prefix       = lookup(element(local.product, count.index)[0],"address_prefix")
      destination_address_prefix  = lookup(element(local.product, count.index)[1],"address_prefix")
      name                        = join("-", ["nsg","${count.index}"])
      priority                    = 100 + count.index
      direction                   = "Outbound"
      access                      = "Allow"
      protocol                    = "*"
      source_port_range           = "*"
      destination_port_range      = "*"
      resource_group_name         = var.rgname
      network_security_group_name = azurerm_network_security_group.myNSG.name

}


resource "azurerm_virtual_network" "Global_VNet" {
  name                = var.vnetname
  resource_group_name = var.rgname
  address_space       = var.VNetAddressSpace
  location            = var.location
}

resource "azurerm_network_security_group" "myNSG" {
  name                = join("-", ["${var.rgname}", "nsg"])
  location            = var.location
  resource_group_name = var.rgname
}


#NSG subnet association
 resource "azurerm_subnet_network_security_group_association" "LabNSGAssoc" {
  count                     = var.subnet_number
  subnet_id                 = azurerm_subnet.mysubnets[count.index].id
  network_security_group_id = azurerm_network_security_group.myNSG.id
} 

Я хочу избежать правил nsg, в которых префикс назначения и источника идентичны, как показано ниже: enter image description here

I пробовали несколько разных функций Terraform, но не нашли решения. У тебя есть идеи?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете отфильтровать коллекцию с помощью необязательного предложения if выражения for :

locals {
  product = [
    for pair in setproduct(azurerm_subnet.mysubnets, azurerm_subnet.mysubnets) : pair
    if pair[0] != pair[1]
  ]
}

Предложение if отфильтровывает любые элементы, для которых заданное условие не выполняется, поэтому с указанным выше условием результат будет включать только те элементы, у которых первый и второй элементы pair различны.

...