模块的动态嵌套块

Mel*_*leD 3 terraform terraform-provider-azure terraform0.12+

我想为 Azure 应用程序网关创建一个模块。

我想使用内联块 disabled_rule_group 禁用一些规则组,但是如何在模块中进行配置?这应该是一个可选变量。

我找到了for_each嵌套块的 。

例子:

variable "disabled_rule_groups" {
  default     = [
    {
      rule_group_name = "REQUEST-931-APPLICATION-ATTACK-RFI"
      rules           = [
        931100,
        931130]
    },
    {
      rule_group_name = "REQUEST-942-APPLICATION-ATTACK-SQLI"
      rules           = [
        942100
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)
resource "azurerm_application_gateway" "AppGateway" {
  dynamic "disabled_rule_group" {
    for_each = [var.disabled_rule_groups]
    content {
      rule_group_name = disabled_rule_group.value.rule_group_name
      rules           = disabled_rule_group.value.rules
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用。

有人知道如何修复语法吗?

此外,该变量disabled_rule_groups应该是可选的。所以如果没有设置 disabled_rule_groups 块应该被禁用。我怎样才能做到这一点?我是否需要第二个布尔变量和一个 if ?

Ale*_*vey 5

是的,您在那里的语法不正确。你显然是这个意思:

resource "azurerm_application_gateway" "AppGateway" {
  dynamic "disabled_rule_group" {
    for_each = var.disabled_rule_groups // Removed [ ] from this line.
    content {
      rule_group_name = disabled_rule_group.value.rule_group_name
      rules           = disabled_rule_group.value.rules
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,该变量disabled_rule_groups应该是可选的。所以如果没有设置 disabled_rule_groups 块应该被禁用。我怎样才能做到这一点?我是否需要第二个布尔变量和一个 if ?

使参数可选的最佳方法是允许它默认为空列表。但是按照您编写的方式,它已经可选的,但是当未指定时,将默认为您写出的默认值。

可能,你想要的是这样的:

variable "disabled_rule_groups" {
  default = []
}
Run Code Online (Sandbox Code Playgroud)

然后,您不需要任何条件逻辑,因为如果您遍历一个空列表(即for_each = []),那么将不会生成那些动态嵌套块,这似乎是您想要的。