向 Terraform 脚本添加条件布尔值
Adding conditional booleans to Terraform script
我正在尝试添加一个名为 'DeployNSG' 的变量作为 true/false 布尔值。当我使用 'Count' 在 NSG 的资源创建中引用变量时,我试图将 NSG 与 Azurerm_Network_security_group_association 与子网相关联,它说我需要在关联中使用计数索引。 . 但是,如果我随后尝试使用元素来引用项目,它会说如果子网关联中未使用计数则不能使用元素。
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 如果我注释掉关联,条件就会起作用,因此我相信这就是卡住的地方。
如果某个资源的 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
}
请注意,我们现在可以在引用 azurerm_network_security_group.ProdNSG
时使用 count.index
,因为 azurerm_subnet_network_security_group_association.ServersNSGAssociation
与 azurerm_network_security_group.ProdNSG
具有相同的 count
值。当一个 NSG 存在时,count.index
将为 0,因此它将 select 第一个(也是唯一的)NSG 实例。当不存在 NSG 时,也不存在 NSG 附件,因此永远不会评估 count.index
。
我正在尝试添加一个名为 'DeployNSG' 的变量作为 true/false 布尔值。当我使用 'Count' 在 NSG 的资源创建中引用变量时,我试图将 NSG 与 Azurerm_Network_security_group_association 与子网相关联,它说我需要在关联中使用计数索引。 . 但是,如果我随后尝试使用元素来引用项目,它会说如果子网关联中未使用计数则不能使用元素。
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 如果我注释掉关联,条件就会起作用,因此我相信这就是卡住的地方。
如果某个资源的 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
}
请注意,我们现在可以在引用 azurerm_network_security_group.ProdNSG
时使用 count.index
,因为 azurerm_subnet_network_security_group_association.ServersNSGAssociation
与 azurerm_network_security_group.ProdNSG
具有相同的 count
值。当一个 NSG 存在时,count.index
将为 0,因此它将 select 第一个(也是唯一的)NSG 实例。当不存在 NSG 时,也不存在 NSG 附件,因此永远不会评估 count.index
。