利用动态块实现Azure虚拟网关的IP分配

mwngjboj  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(120)

如何通过. tfvar文件从核心模块到子模块动态传递值到terraform中的资源块。有2个模块1)核心模块和2)调用模块

resource "azurerm_virtual_network_gateway" "this" {
  name                = var.name
  location            = var.location
  resource_group_name = var.rg
  type                = var.type
  sku                 = var.sku

  dynamic "ip_configuration" {
    for_each = var.ip_config
    content {
    name                          = ip_configuration.value.name
    public_ip_address_id          = ip_configuration.value.address_id
    subnet_id                     = ip_configuration.value.subnet_id
    }
  }
}
variable "ip_config" {
  type = map(object({
    name       = string
    address_id = string
    subnet_id  = string
  }))
}

调用模块代码:

module "vnet_gw" {
source = ""
for_each = var.vnet_gw 
  name = each.value.name
  .
  .
  .
  ip_config = {
    ipconfig_name        = each.value.ip_config.ip_name
    public_ip_address_id = each.value.ip_config.addr_id
    subnet_id            = each.value.ip_config.s_id
  }
}

variable.tf file for the calling module.

ip_config = list(object({

  ipconfig_name        = string
  public_ip_address_id = string
  subnet_id            = string

}))

传递值的tf var文件。ip部分需要添加多个部分。

vnet_gw {
  "vnet1" = {
    name : ""
    rg : ""
    .
    .
    .
  ip_config = {
    "ip_1" : {
      ip_name              = "test1"
      addr_id              = "<id>"
      s_id                 = "<id>"
  },
    "ip_2" : {
       ip_name              = "test2"
       addr_id              = "<id>"
       s_id                 = "<id>"
   }
  }
 }
}

如何获得执行计划的以下错误
在www.example.com行,模块"vnet_gw"中:main.tf line , in module "vnet_gw": each.value.ip_config is map of object with 2 elements This map does not have an element with the key "ip_name" similar for public address id and subnet_id

vddsk6oq

vddsk6oq1#

在使用for_each循环时会出现一些基本的语法错误。当你将对象Map传递给任何调用模块时,注意这些变量的索引是很重要的。在你的例子中,调用模块看起来像这样:

module "vnet_gw" {
source = ""
for_each = var.vnet_gw 
  name = each.value.name
  .
  .
  .
  ip_config = {
    ipconfig_name        = each.value.ip_config.ip_name
    public_ip_address_id = each.value.ip_config.addr_id
    subnet_id            = each.value.ip_config.s_id
  }
}

注意,这里你引用了一个有两个对象的Map,所以通过引用each.value.ip_config.ip_name中的ip_name,你就指定了这个Map中只有一个ip_config对象,这是错误的。
像这样引用对象可以解决您的问题。

module "vnet_gw" {
source = ""
for_each = var.vnet_gw 
  name = each.value.name
  .
  .
  .
  ip_config = {
    ipconfig_name        = each.value.ip_config[each.key].ip_name
    public_ip_address_id = each.value.ip_config[each.key].addr_id
    subnet_id            = each.value.ip_config[each.key].s_id
  }
}

相关问题