Добавление условных логических значений в скрипт Terraform

Я пытаюсь добавить переменную DeployNSG как логическое значение true / false. Когда я ссылаюсь на переменную в создании ресурса для NSG с помощью «Count», я затем пытаюсь связать NSG с Azurerm_Network_security_group_association с подсетью, и в нем говорится, что мне нужно использовать индекс счетчика в ассоциации .. однако, если я тогда попробую и используйте element для ссылки на элемент, он говорит, что вы не можете использовать element, если 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 работает, если я закомментирую ассоциацию, поэтому я считаю, что именно здесь она застряла.


person Matty21202    schedule 19.09.2019    source источник


Ответы (1)


Если есть ситуации, когда 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. Когда существует одна группа безопасности сети, count.index будет равно 0, и поэтому будет выбран первый (и единственный) экземпляр сети безопасности. Если группы безопасности сети не существуют, вложения в нее также не будут существовать, поэтому count.index никогда не будет оцениваться.

person Martin Atkins    schedule 19.09.2019