我正在使用测试 Terraform Stacks 构建,创建一个资源组,然后在其中放置一些资源。 每个资源都是使用单独的模块创建的,因此一个用于资源组,另一个用于 vnet、子网等。当我在构建过程中引用另一个组件(例如放置 vnet 的资源组的名称)时,我收到错误“不支持的属性 - 该对象没有名为“resource_group_name”的属性。
# input vars:
location = {
dev = ["eastus2",]
stage = ["eastus2",]
prod = ["centralus","westus"]
}
environment = "dev"
app_name = "app1"
# components.tfstack.hcl:
component "rg" {
for_each = var.location
source = "./modules/rg"
inputs = {
name = "${each.value}-${var.environment}-${var.app_name}-rg"
location = each.value
tags = var.tags
}
providers = {
azurerm = provider.azurerm.this
}
}
component "vnet" {
for_each = var.location
source = "./modules/vnet"
inputs = {
name = "${each.value}-${var.environment}-${var.app_name}-vnet"
location = each.value
resource_group_name = component.rg.resource_group_name
address_space = var.vnet_address_space
tags = var.tags
}
providers = {
azurerm = provider.azurerm.this
}
}
# resource group module:
resource "azurerm_resource_group" "rg" {
name = var.name
location = var.location
tags = var.tags
}
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
该计划显示了正在创建的正确资源组名称,并且 Hashicorp 代码示例似乎支持我的语法。 从资源组创建模块输出“名称”属性字符串应该用“组件.其他组件名称.输出字符串名称”引用,我是否遗漏了什么或做错了什么?
Terraform 堆栈组件引用模块输出错误:“不支持的属性”
问题似乎与您在资源组模块中声明名称属性的方式有关。
您应该按照 vnet 模块配置中提到的
module.rg[each.key].resource_group_name
正确引用输出的方式使用。
演示配置:
variable "location" {
type = map(list(string))
default = {
dev = ["eastus2"]
stage = ["eastus2"]
prod = ["centralus", "westus"]
}
}
variable "environment" {
type = string
default = "dev"
}
.
.
module "rg" {
source = "./modules/rg"
for_each = { for k, v in var.location : k => v }
name = "${each.value[0]}-${var.environment}-${var.app_name}-rg"
location = each.value[0]
tags = var.tags
}
module "vnet" {
source = "./modules/vnet"
for_each = { for k, v in var.location : k => v }
name = "${each.value[0]}-${var.environment}-${var.app_name}-vnet"
location = each.value[0]
resource_group_name = module.rg[each.key].resource_group_name
address_space = ["10.0.0.0/16"]
tags = var.tags
}
模块/rg:
resource "azurerm_resource_group" "rg" {
name = var.name
location = var.location
tags = var.tags
}
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
模块/vnet:
resource "azurerm_virtual_network" "vnet" {
name = var.name
location = var.location
resource_group_name = var.resource_group_name
address_space = var.address_space
tags = var.tags
}
部署:
参考:
https://developer.hashicorp.com/terraform/language/modules/develop
for_each 元参数 - 配置语言 |地形 | HashiCorp 开发商
输出值 - 配置语言 |地形 | HashiCorp 开发商
Terraform 使用 for_each 引用另一个模块的输出 - Stack Overflow 由 charles-xu
回答