如何将Subnet ID输出到output.tf?Terraform报错求助
问题背景
你尝试配置output.tf输出子网ID,当前输出代码如下:
output "subnet_id" { value = module.virtualnetwork_module.azurerm_subnet.subneta.id }
执行terraform plan时触发以下错误:
Error: Reference to undeclared module
on virtualnetwork\outputs.tf line 2, in output "subnet_id":
2: value = module.virtualnetwork_module.azurerm_subnet.subneta.idNo module call named "virtualnetwork_module" is declared in module.virtualnetwork_module.
虽然后续确认tfstate中存在module.virtualnetwork_module.azurerm_subnet.subneta资源及其ID,但报错依然存在。
解决方案
1. 模块内部输出资源:直接引用资源本身
如果你的outputs.tf位于virtualnetwork_module模块内部(即报错提示的module.virtualnetwork_module目录下),模块内部引用自身资源不需要加module.xxx前缀,直接使用资源名称即可。修改后的输出代码:
output "subnet_id" { value = azurerm_subnet.subneta.id }
2. 父模块输出子模块资源:先定义子模块输出,再父模块引用
如果需要在根模块(或其他调用virtualnetwork_module的父模块)中输出子网ID,需分两步操作:
- 第一步:在
virtualnetwork_module内部的outputs.tf中添加子网ID输出(即上面的写法)。 - 第二步:在父模块的
outputs.tf中引用子模块的输出值:
output "subnet_id" { value = module.virtualnetwork_module.subnet_id }
3. 理解tfstate路径与模块引用的区别
tfstate中的module.virtualnetwork_module.azurerm_subnet.subneta是资源在状态文件中的完整标识路径,仅用于状态管理。模块内部引用资源时,Terraform会自动识别当前模块的资源,无需额外添加模块前缀。
内容的提问来源于stack exchange,提问作者Darren

