远程 terraform 模块的输出变量

Posted

技术标签:

【中文标题】远程 terraform 模块的输出变量【英文标题】:Output variables from remote terraform module 【发布时间】:2021-05-06 22:27:06 【问题描述】:

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

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

错误:不支持的属性

在输出.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]

感谢任何帮助!

【问题讨论】:

您能分享一下您的模块资源组的代码吗? 该代码已经在帖子中,在“Azure 资源组模块代码如下所示”下 【参考方案1】:

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

module.resourceGroups[0].resource_group_name

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

resource.resourceGroups[*].resource_group_name

【讨论】:

【参考方案2】:

模块中的变量需要有typedefault

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

variable "location" 
    type = string


variable "resource_group_name" 
    type = string

【讨论】:

不幸的是它没有用。得到同样的错误。该问题已使用最新的错误消息和代码进行了更新。【参考方案3】:

我们应用的解决方案是将计数从 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

感谢您的贡献

【讨论】:

以上是关于远程 terraform 模块的输出变量的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 模块 - 输出变量作为另一个模块的输入

在 Terraform 远程后端使用变量

Terraform 模块依赖关系破坏了 template_file

在另一个模块中为 EC2 添加指定子网 - AWS Terraform -

在模块内的模块之间传递 Terraform 变量?

Terraform 学习笔记