来自远程 terraform 模块的输出变量

问题描述

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

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

错误不支持属性

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

这个值没有任何属性

不支持属性

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

这个值没有任何属性

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

ma​​in.tf

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

variables.tf

variable "location" {
    type = string
}

variable "resource_group_name" {
    type = string
}

outputs.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]
}

variables.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"]
}

outputs.tf

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

感谢任何帮助!

解决方法

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

module.resourceGroups[0].resource_group_name

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

resource.resourceGroups[*].resource_group_name
,

模块中的变量需要有 typedefault

例如,这将是一个有效的文件:

variable "location" {
    type = string
}

variable "resource_group_name" {
    type = string
}
,

我们应用的解决方案是将计数从 terraformMain.tf 移动到资源模块 main.tf。这允许我们通过模块的 output.tf 将资源组传递给 terraformMain。

资源组模块:

ma​​in.tf

resource "azurerm_resource_group" "RG" {
  count     = length(var.resource_group_name)
  name  = var.resource_group_name[count.index]
  location = var.location
}

outputs.tf

output "resource_group_names" {
   value       = azurerm_resource_group.RG.*.name
}

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" {
      source    = "git::https://*****@dev.azure.com/*****/TerraformAzureModules/_git/ResourceGroup"
      location  = var.location
      resource_group_name = var.resourcegroups
    }

module "vnet" {
  source = "git::https://******@dev.azure.com/*****/TerraformAzureModules/_git/VirtualNetwork"
  resourcegroup_name = module.resourceGroups.resource_group_names[0]
  location = var.location  
  vnet_name = var.vnet_name
  vnet_cidr = var.vnet_cidr 
  subnet_cidr = var.subnet_cidr
  subnet_name = var.subnet_names
}

感谢您的贡献

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...