首页 > 解决方案 > 远程 terraform 模块的输出变量

问题描述

对于我使用远程模块(git 模块)的项目,这些模块在 terraformMain.tf 文件中被调用和执行。

例如,我使用 Azure 资源组模块,该模块在 terraformMain.tf 中通过“count = length (var.resourcegroups)”循环。我现在遇到的问题是我想在下一个模块(创建 VNET)中使用两个创建的资源组之一,但我一直遇到以下错误:

错误:不支持的属性

在 output.tf 第 2 行,在输出“RG”中: 2: value = [module.resourceGroups.resource_group_name]

该值没有任何属性。

不支持的属性

在 terraformMain.tf 第 33 行,在模块“vnet”中:33:resourcegroup_name = module.resourceGroups.resource_group_name[0]

该值没有任何属性。

Azure 资源组模块代码如下所示:

主文件

resource "azurerm_resource_group" "RG" {
  name  = var.resource_group_name
  location = var.location
}

变量.tf

variable "location" {
    type = string
}

variable "resource_group_name" {
    type = string
}

输出.tf

output "resource_group_names" {
   value       = concat(azurerm_resource_group.RG.*.name, [""])[0]
}

terraformMain.tf 的代码如下所示:

terraformMain.tf

terraform {
  required_version = ">= 0.13"

  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "2.45.1"
    }
  }

  backend "azurerm" {
    resource_group_name   = "__terraformresourcegroup__"
    storage_account_name  = "__terraformstorageaccount__"
    container_name        = "__terraformcontainer__"
    key                   = "__terraformkey__"
  }

}

provider "azurerm" {
  features {}
}

module "resourceGroups" {
  count     = length(var.resourcegroups)
  source    = "git::https://*****@dev.azure.com/****/TerraformAzureModules/_git/ResourceGroup"
  location  = var.location
  resource_group_name = var.resourcegroups[count.index]
}

module "vnet" {
  source = "git::https://*****@dev.azure.com/****/TerraformAzureModules/_git/VirtualNetwork"
  resourcegroup_name = module.resourceGroups.resource_group_name[0]
  location = var.location  
  vnet_name = var.vnet_name

  count     = length(var.subnet_names)
  vnet_cidr = var.vnet_cidr[count.index]  
  subnet_cidr = var.subnet_cidr[count.index]
  subnet_name = var.subnet_names[count.index]
}

变量.tf

variable "location" {
    default = "westeurope" 
}

variable "resourcegroups" {
    default = ["rg1", "rg2"]
}

#Azure Vnet / Subnet
variable "vnet_name" {
  default = "vnet_1"
}
variable "subnet_names" {
  default = ["subnet1", "subnet2"]
}
variable "vnet_cidr" {
  default = ["10.116.15.0/24"]
}
variable "subnet_cidr" {
  default     = ["10.116.15.0/26", "10.116.15.128/27"]
}

输出.tf

output "RG" {
  value       = [module.resourceGroups.resource_group_name]
}

任何帮助表示赞赏!

标签: azurevariablesterraformazure-rm

解决方案


您的resourceGroups模块已count = length(var.resourcegroups)设置,module.resourceGroups对象列表也是如此,因此您需要在访问属性之前从列表中请求特定元素:

module.resourceGroups[0].resource_group_name

或者,如果您的目标是返回所有资源组名称的列表,则可以使用运算[*]简洁地访问resource_group_name每个元素的参数并将结果作为列表返回:

resource.resourceGroups[*].resource_group_name

推荐阅读