terraform 堆栈组件引用模块输出错误:“不支持的属性”

问题描述 投票:0回答:1

我正在使用测试 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 terraform-provider-azure
1个回答
0
投票

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
}

部署:

enter image description here

enter image description here

参考:

https://developer.hashicorp.com/terraform/language/modules/develop

for_each 元参数 - 配置语言 |地形 | HashiCorp 开发商

输出值 - 配置语言 |地形 | HashiCorp 开发商

Terraform 使用 for_each 引用另一个模块的输出 - Stack Overflowcharles-xu

回答
© www.soinside.com 2019 - 2024. All rights reserved.