首页 文章

Terraform,资源可以作为变量传递到模块中吗?

提问于
浏览
2

我刚刚接触Terraform(如果这是一个愚蠢的问题,那么道歉) .

我正在设置一个带有一组子网的azure vnet,每个子网都有一个通过防火墙发送流量的路由表 .

看起来子网和路由表组合将成为一个良好的可重用模块 .

按照惯例,我想在与父vnet相同的资源组和位置中创建子网和路由表 .

如果我将模块中所需的所有值都作为单独的值提供,那么该模块可以正常运行:)

我宁愿做的是有效地将代表父vnet的资源作为“参数”传递给模块,让模块直接从vnet资源中读取资源组名称,位置和vnet名称,以便: - 我输入较少(我只使用vnet创建模块实例,而不是为vnet名称,资源组名称和位置创建单独的值) - 它在路由表和子网上设置位置和资源组名称时消除了出错的机会(如果我从模块中的父vnet读取值,则值将与父vnet相同)

目前,模块变量定义为:

variable "parent-vnet-name" {}

variable "parent-vnet-resource-group-name" {}

variable "parent-vnet-location" {}

variable "subnet-name" {
  type = "string"
}

variable "subnet-address-prefix" {}

variable "firewall-ip-private" {}

和模块为:

resource "azurerm_route_table" "rg-mgt-network__testtesttest" {
   name                = "${var.subnet-name}"
  location            = "${var.parent-vnet-location}"
  resource_group_name = "${var.parent-vnet-resource-group-name}"

  route {
    name                   = "Default"
    address_prefix         = "0.0.0.0/0"
    next_hop_type          = "VirtualAppliance"
    next_hop_in_ip_address = "${var.firewall-ip-private}"
  }
}

真的我想做的更像是变量:

variable "parent-vnet" {}

variable "subnet-name" {
  type = "string"
}

variable "subnet-address-prefix" {}

variable "firewall-ip-private" {}

与模块做类似的事情:

resource "azurerm_route_table" "rg-mgt-network__testtesttest" {
  name                = "${var.subnet-name}"
  location            = "${var.parent-vnet.location}"
  resource_group_name = "${var.parent-vnet.resource-group-name}"

  route {
    name                   = "Default"
    address_prefix         = "0.0.0.0/0"
    next_hop_type          = "VirtualAppliance"
    next_hop_in_ip_address = "${var.firewall-ip-private}"
  }
}

我玩过各种各样的事情(例如尝试传递vnet而不指定属性名称(验证失败)或使用数据源撤回vnet(数据源没有资源组信息) )但是没有任何地方,所以我想知道我是否错过了什么?

干杯,安迪

1 回答

  • 1

    这当前不可能 - 根据Terraform Creating Modules page,模块的输入变量只能是标准变量类型: stringlistmap .

    我遇到了同样的用例,不得不提供大量的模块输入列表,这不是理想的,但似乎是世界的现状 .

相关问题