Добавление условных логических значений в скрипт Terraform - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь добавить переменную с именем DeployNSG в качестве истинного / ложного логического значения.Когда я ссылаюсь на переменную в создании ресурса для NSG, используя 'Count', я тогда пытаюсь связать NSG с Azurerm_Network_security_group_association с подсетью, и он говорит, что мне нужно использовать индекс count в ассоциации ... однако, если я тогда пытаюсьи использовать элемент для ссылки на элемент, он говорит, что вы не можете использовать элемент, если счетчик не используется в ассоциации подсети.


resource "azurerm_network_security_group" "ProdNSG" {
  count = "${var.DeployNSG ? 1 : 0}"
  name                = "${var.ProdNSG}"
  location            = "${var.location}"
  resource_group_name = "${azurerm_resource_group.ProdNetworkRG.name}"

  security_rule {
    name                       = "AllowRDP"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "3389"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }
}

resource "azurerm_virtual_network" "ProdVNet" {
  name          = "${var.ProdVNet}"
  resource_group_name = "${azurerm_resource_group.ProdNetworkRG.name}"
  address_space = "${var.ProdVNetAddressSpace}"
  location      = "${var.location}"


}

resource "azurerm_subnet" "ServersSubnet" {
  resource_group_name = "${azurerm_resource_group.ProdNetworkRG.name}"
  name = "${var.ServersSubnet}"
  address_prefix = "${var.ServersSubnetAddressPrefix}"
  virtual_network_name = "${azurerm_virtual_network.ProdVNet.name}"

}

resource "azurerm_subnet_network_security_group_association" "ServersNSGAssociation" {
  subnet_id                 = "${azurerm_subnet.ServersSubnet.id}"
  network_security_group_id = "${azurerm_network_security_group.ProdNSG.id}"
}

Условие True / False работает, если я закомментирую связь, поэтому яповерьте, это то место, где оно застряло.

1 Ответ

0 голосов
/ 19 сентября 2019

Если есть ситуации, когда count для одного ресурса может быть нулевым, то в любом другом месте, где вы ссылаетесь на этот ресурс, вы должны указать Terraform, как обрабатывать случай, когда другой объект не существует.

В этом случае кажется, что вам вообще не понадобится ресурс azurerm_subnet_network_security_group_association, если группа сетевой безопасности не существует, и поэтому самый простой ответ - применить тот же count к этому другому ресурсу:

resource "azurerm_network_security_group" "ProdNSG" {
  count = var.DeployNSG ? 1 : 0

  # ...other arguments as you already have set...
}

resource "azurerm_subnet_network_security_group_association" "ServersNSGAssociation" {
  # Create one of this resource only if there is one of the other resource.
  count = length(azurerm_network_security_group.ProdNSG)

  subnet_id                 = azurerm_subnet.ServersSubnet.id
  network_security_group_id = azurerm_network_security_group.ProdNSG[count.index].id
}

Обратите внимание, что теперь мы можем использовать count.index при обращении к azurerm_network_security_group.ProdNSG, поскольку azurerm_subnet_network_security_group_association.ServersNSGAssociation имеет то же значение count, что и azurerm_network_security_group.ProdNSG.Когда существует один NSG, count.index будет 0 и, таким образом, он выберет первый (и единственный) экземпляр NSG.Если не существует NSG, то и вложения NSG тоже не будут, поэтому count.index никогда не будет оцениваться.

...