2

我想构建一个语法如下的模块:

module "order_module" {

  service {
    name ="some-name"
  }

  lambda {
    name = "some-lambda-name"
  }

}

理想情况下,我希望能够以这种方式提供多种服务和功能:

module "order_module" {

  service {
    name ="some-name"
  }

  service {
    name ="some-name-1"
  }

  lambda {
    name = "some-lambda-name"
  }

  lambda {
    name = "some-lambda-name-2"
  }

  lambda {
    name = "some-lambda-name-3"
  }
}

使用变量我可以这样做:

module "order_module" {

  service = {
    name ="some-name"
  }

  lambda = {
    name = "some-lambda-name"
  }
}

但是,当我想提供更多服务时,我需要将它们放在一个列表中:

module "order_module" {

  service = [{
    name ="some-name"
  },
  {
    name ="some-name-2"
  }]

  lambda = {
    name = "some-lambda-name"
  }
}

我没有找到用块构建模块的方法。原生资源有这个:

resource "azurerm_key_vault" "lab" {
  name                = "${var.app_name}${var.env_name}vault${random_id.lab.dec}"
  location            = azurerm_resource_group.lab.location
  resource_group_name = azurerm_resource_group.lab.name
  tenant_id           = data.azurerm_client_config.lab.tenant_id

  sku_name = "standard"

  access_policy {
    tenant_id = data.azurerm_client_config.lab.tenant_id
    object_id = data.external.lab.result.objectId

    key_permissions = []

    secret_permissions = [
      "list",
      "set",
      "get",
      "delete"
    ]
  }
}

access_policy以上。这是否可以通过这些块向模块提供参数?

4

1 回答 1

2

Terraform 模块声明块中的嵌套块目前在 HCL2 语法的 Terraform DSL 中是不允许的。这可以在模块块语法文档中确认。语法模式的文档指定块中只允许使用参数。

嵌套块 inresourcedatablocks 的实现是使用 Terraform 提供程序 SDK。在提供程序中实现不同的模块模式是不可能的,因此这就是为什么当前工具无法实现。在 SDK 版本 1 中,嵌套块的相应架构是:

Type: schema.TypeMap, // or schema.TypeSet
Elem: &schema.Schema{
  Type: schema.TypeString,
},

从 SDK 的第 2 版开始,此模式现在对应于 类型的参数Map。我的猜测是,这部分是为了允许在复杂类型中指定参数及其类型。这是通过将架构更改为嵌套块实现的:

Type: schema.TypeSet,
Elem: &schema.Resource{...}

现在Elem是一个嵌套的schema.Resource,它允许这个规范。以前的模式(现在对应于参数)现在对任意键值对更有用,例如 for tagsin resources(注意这也可能是 Terraform 提供程序和最近在 Packer 中的更新导致语法从嵌套块更改为某些参数的类型Map)。

Terraform 核心 Go 代码需要更新以允许在模块块声明的 HCL2 语法中嵌套块。

另请注意,在撰写本文时,此架构的文档尚未针对 SDK v2 进行更新,应将其解读为与 v1 相对应(这就是我在开头引用 v1 行为的原因)。

于 2021-11-19T15:26:43.710 回答