Krz*_*tof 5 terraform terraform-modules
我想构建一个语法如下的模块:
module "order_module" {
service {
name ="some-name"
}
lambda {
name = "some-lambda-name"
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够以这种方式提供多种服务和功能:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
使用变量我可以这样做:
module "order_module" {
service = {
name ="some-name"
}
lambda = {
name = "some-lambda-name"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我想提供更多服务时,我需要将它们放入列表中:
module "order_module" {
service = [{
name ="some-name"
},
{
name ="some-name-2"
}]
lambda = {
name = "some-lambda-name"
}
}
Run Code Online (Sandbox Code Playgroud)
我没有找到用 block 构建模块的方法。原生资源有这样的:
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"
]
}
}
Run Code Online (Sandbox Code Playgroud)
access_policy多于。是否可以通过此类块向模块提供参数?
目前,HCL2 语法的 Terraform DSL 中不允许 Terraform 模块声明块中的嵌套块。这可以在模块块语法文档中得到确认。语法模式的文档指定块中只允许使用参数。
resource和块中的嵌套块的实现data是通过 Terraform 提供程序 SDK 实现的。不可能在提供程序中实现不同的模块架构,因此这就是当前工具无法实现的原因。在 SDK 版本 1 中,嵌套块的相应架构为:
Type: schema.TypeMap, // or schema.TypeSet
Elem: &schema.Schema{
Type: schema.TypeString,
},
Run Code Online (Sandbox Code Playgroud)
从 SDK 版本 2 开始,此架构现在对应于 类型的参数Map。我的猜测是,这部分是为了允许在复杂类型中指定参数及其类型。这是通过将模式更改为嵌套块来实现的:
Type: schema.TypeSet,
Elem: &schema.Resource{...}
Run Code Online (Sandbox Code Playgroud)
其中Elem现在 是一个嵌套的schema.Resource,它允许此规范。以前的模式(现在对应于参数)现在对于任意键值对更有用,例如对于tags资源(请注意,这也可能是为什么 Terraform 提供程序和最近 Packer 中的更新导致语法从嵌套块更改为参数输入Map某些参数)。
Terraform 核心 Go 代码需要更新,以允许在模块块声明的 HCL2 语法中嵌套块。
另请注意,在撰写本文时,该架构的文档尚未针对 SDK v2 进行更新,应将其视为对应于 v1(这就是我在开头引用 v1 行为的原因)。
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |