【问题标题】:Output variables from remote terraform module远程 terraform 模块的输出变量
【发布时间】: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 资源组模块代码如下所示”下

标签: azure variables terraform azure-rm


【解决方案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
    }
    

    感谢您的贡献

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 2021-01-11
      • 2019-04-29
      • 2021-02-12
      • 2021-04-01
      • 2021-03-07
      • 1970-01-01
      • 2020-12-08
      • 2019-12-05
      相关资源
      最近更新 更多