远程 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 资源组模块代码如下所示:
main.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】:模块中的变量需要有type
或default
。
例如,这将是一个有效的文件:
variable "location"
type = string
variable "resource_group_name"
type = string
【讨论】:
不幸的是它没有用。得到同样的错误。该问题已使用最新的错误消息和代码进行了更新。【参考方案3】:我们应用的解决方案是将计数从 terraformMain.tf 移动到资源模块 main.tf。这允许我们通过模块的 output.tf 将资源组传递给 terraformMain。
资源组模块:
main.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 模块依赖关系破坏了 template_file