我是Azure Terraform的新手,在azurerm_network_interface资源的这一部分上正确设置public_ip_address_id时遇到问题。我可以征求意见。谢谢你,谢谢
我正在创建8个接口,并尝试在前3个接口上绑定公共IP。我尝试使用try函数在前3个接口上返回并设置public_ip_id,并在其余接口上设置null
resource "azurerm_network_interface" "virtual_network_interfaces" {
for_each = var.interfaces
location = var.location
resource_group_name = var.resource_group_name
name = "${var.device_name}_${var.instance_type}_${var.site_name}_${each.value.name}_Interface"
enable_ip_forwarding = true
enable_accelerated_networking = true
ip_configuration {
name = "${var.device_name}_${var.instance_type}_${var.site_name}_${each.value.name}_IP_Config"
private_ip_address = each.value.address_prefixes[0]
private_ip_address_allocation = "Static"
# set Management interface as primary vNIC
primary = each.value.name == "Management" ? true : false
subnet_id = try(
lookup(
{ for k, v in var.subnets : v.name => v.id },
each.value.name, null
), null
)
public_ip_address_id = try(
{
for k1, v1 in var.public_ips :
k1 => can(regex("${each.value.name}", v1.name)) ? v1.id : null
},
null)
}
}
2条答案
按热度按时间x7yiwoj41#
我尝试在azurerm_network_interface public_ip_address_id上设置值,并且能够成功配置需求。
当前用于设置
public_ip_address_id
的逻辑是在var.public_ips
上进行配置,并针对每个公共IP检查当前NIC的名称(来自var.interfaces
)是否与公共IP的名称匹配。如果是,则将public_ip_address_id
设置为该公网IP的ID,否则将其设置为null
。这种方法的问题是,逻辑将始终返回最后匹配的公共IP的ID(如果没有找到匹配,则返回
null
)。这并不理想,因为如果多个公共IP与NIC的名称匹配,则只会设置最后一个。此外,
can(regex())
函数在这里的使用并不理想。如果您尝试将前3个接口绑定到公共IP,建议使用更确定性的方法。我试图实现您的要求使用我赢得了配置模块的变化,其中提到如下。
我的地形配置:
main.tf:
variable.tf:
输出:
此配置将创建一个虚拟网络、一个子网、3个公共IP和8个网络接口。这些接口中的前3个将绑定到公共IP,而其余的将没有公共IP。
xbp102n02#
我怀疑try代码块返回map对象,为了证明这个理论,我做了以下更改。看起来try块返回了一个map对象。任何修改/增强此代码块的建议。谢谢!2谢谢!