我刚开始接触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" {}
Run Code Online (Sandbox Code Playgroud)
和模块为:
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}"
}
}
Run Code Online (Sandbox Code Playgroud)
确实,我想做的更像是变量:
variable "parent-vnet" {}
variable "subnet-name" {
type = "string"
}
variable "subnet-address-prefix" {}
variable "firewall-ip-private" {}
Run Code Online (Sandbox Code Playgroud)
与模块做类似的事情:
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}"
}
}
Run Code Online (Sandbox Code Playgroud)
我玩过很多事情(例如尝试不指定属性名称就通过vnet(验证失败)或使用数据源拉回vnet(数据源没有资源组信息) ),但是什么都没有,所以我想知道我是否错过了什么?
干杯,安迪
小智 22
这可以通过 terraform > 0.12 实现。您可以使用object类型,但必须明确列出您在模块中使用的字段。
# module's variables.tf
variable "parent_vnet" {
# List each field in `azurerm_route_table` that your module will access
type = object({
name = string
location = string
resource_group_name = string
})
}
# caller
resource "azurerm_route_table" "my_parent_vnet" {
# ...
}
module "my-module" {
parent_vnet = azurerm_route_table.my_parent_vnet
}
Run Code Online (Sandbox Code Playgroud)
编辑:请参阅/sf/answers/4057438451/获取更新的答案
目前这是不可能的 - 根据Terraform 创建模块页面,模块的输入变量只能是标准变量类型:string、list和map。
我遇到过同样的用例,并且必须向模块提供大量输入列表,这并不理想,但似乎是世界的当前状态。
| 归档时间: |
|
| 查看次数: |
1653 次 |
| 最近记录: |