如何通过Terraform获取Azure虚拟机规模集(VMSS)的私有IP地址
解决Azure虚拟机规模集Terraform输出私有IP的方法
核心原因
你无法直接从azurerm_virtual_machine_scale_set资源的network_profile属性拿到私有IP,是因为该属性仅存储VMSS的网卡配置模板,实际分配的私有IP属于每个VM实例独立生成的网卡资源,需要通过数据源拉取实例级网卡信息获取。
操作步骤
- (可选)补全VMSS IP配置属性
先确保你的VMSS的ip_configuration块中明确指定IP版本(不补全也可正常运行,添加后配置稳定性更高):
# 以主网卡配置为例,第二个网卡同理补充即可 ip_configuration { name = "ip" primary = true subnet_id = module.subnet.id private_ip_address_version = "IPv4" # 新增项,需要IPv6的话修改为对应值即可 }
- 新增VMSS实例网卡数据源
通过azurerm_virtual_machine_scale_set_network_interface数据源批量拉取所有VM实例的网卡信息:
data "azurerm_virtual_machine_scale_set_network_interface" "vmss_nics" { for_each = toset(azurerm_virtual_machine_scale_set.test.instances[*].instance_id) name = "${local.name}-nic-1" # 要获取哪个网卡的IP就填对应网卡名,拿第二个网卡改为${local.name}-nic-2 virtual_machine_scale_set_id = azurerm_virtual_machine_scale_set.test.id virtual_machine_id = each.value }
- 定义私有IP输出项
按需要输出所有实例的私有IP即可:
# 输出所有VMSS实例的对应网卡私有IP列表 output "vmss_private_ip_list" { value = [for nic in data.azurerm_virtual_machine_scale_set_network_interface.vmss_nics : nic.private_ip_address] }
如果需要按实例ID映射IP,也可以修改输出值为键值对格式:
output "vmss_instance_ip_map" { value = { for instance_id, nic in data.azurerm_virtual_machine_scale_set_network_interface.vmss_nics : instance_id => nic.private_ip_address } }
内容的提问来源于stack exchange,提问作者Vijay Daswani
相关产品推荐
相关产品推荐

