terraform - 向 Terraform 脚本添加条件布尔值
问题描述
我正在尝试添加一个名为“DeployNSG”的变量作为真/假布尔值。当我使用“计数”在 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}"
}
如果我注释掉关联,则真/假条件有效,因此我相信这是卡住的地方。
解决方案
如果在某些情况下count
for one 资源可能为零,那么在您引用该资源的任何其他位置,您必须告诉 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
永远不会被评估。
推荐阅读
- keypress - 字符转换
- javascript - 从数组映射 wordpress 帖子
- javascript - 计算表格中复选框的数量和数量
- c# - Json数据检索
- apache - 使用 .htaccess 始终重定向到 index.php 时出现 500 内部服务器错误
- python - 使用 Selenium 通过自定义按钮属性查找元素
- sql - Access SQL 查询:仅显示重复记录的最新记录
- kotlin - 为什么在某些设备上公共字段的设置器是私有的?
- macos - 具有应用生命周期的 SwiftUI macOS 应用在接收通用链接时不会触发 onOpenURL
- python - 我将如何解决(发现样本数量不一致的输入变量)