模块中的地形条件

时间:2020-01-16 10:56:49

标签: module terraform azure-application-gateway

我正在尝试在调用applicationg网关模块时创建一些简单的逻辑。

在创建WAF v2应用程序网关时,我想指定更多简单应用程序网关无法处理的属性,因此将不再对其进行描述。

resource "azurerm_application_gateway" {
  name                = var.appgatewayname
  resource_group_name = data.azurerm_resource_group.rg.name
  location            = data.azurerm_resource_group.rg.location

......................

  waf_configuration {
    enabled                  = "${length(var.waf_configuration) > 0 ? lookup(var.waf_configuration, "enabled", "") : null }"
    firewall_mode            = "${length(var.waf_configuration) > 0 ? lookup(var.waf_configuration, "firewall_mode", "") : null }"
............

调用模块:

module "GWdemo" {
  source      = "./...."

  sku-name     = "WAF_v2"
  sku-tier     = "WAF_v2"
  sku-capacity = 1
  waf-configuration = [
    {
      enabled                  = true
      firewall_mode            = "Detection"
}

我想对的是,如果指定了waf-configuration映射,则应指定应用以下设置,并且是否不为null?

2 个答案:

答案 0 :(得分:3)

在使用Terraform时,我们经常希望将涉及条件测试的问题重新组织为涉及可能包含或可能不包含元素的集合的问题,因为Terraform语言功能围绕着将集合转换为逐个元素的配置的方向

在您的情况下,您有一个已经是列表的变量,因此可以确保它的默认值是一个空列表而不是null,从而可以只生成一个{{ 1}}每个元素块:

waf_configuration

然后,您可以使用dynamic block为该列表的每个元素生成一个variable "waf_configuration" { type = list(object({ enabled = bool firewall_mode = string })) default = [] } 块:

waf_configuration

尽管似乎不适用于此特定示例,但另一个常见模式是可以将其设置为启用某项或不对其进行禁用的变量。例如,如果您的模块设计为仅采用单个可选WAF配置,则可以这样定义变量:

  dynamic "waf_configuration" {
    for_each = var.waf_configuration
    content {
      enabled       = waf_configuration.value.enabled
      firewall_mode = waf_configuration.value.firewall_mode
    }
  }

如上所述,与Terraform中的内容类似的最佳方法是将其重铸为可能为空的列表。由于这是一种常见情况,因此可以通过splat expressions来简化它:

variable "waf_configuration" {
  type = object({
    enabled       = bool
    firewall_mode = string
  })
  default = null
}

当我们将 dynamic "waf_configuration" { for_each = var.waf_configuration[*] content { enabled = waf_configuration.value.enabled firewall_mode = waf_configuration.value.firewall_mode } } 运算符应用于非列表/非设置类型的值时,Terraform将测试该值是否为[*]。如果为null,则结果将为空列表,而如果 not 为null,则结果将为包含该值的单元素列表。

转换为列表后,我们可以按常规方式在null的{​​{1}}参数中使用它,并从for_each块内的单个元素访问属性。我们不需要为每个参数重复条件,因为dynamic块内容仅在列表为非空时才求值。

答案 1 :(得分:1)

我鼓励您升级到Terraform v0.12.x,这样做应该会容易得多。我将利用新的动态块语法,根据您需要使用的任何条件使该块为可选。

这是一个粗略的例子,但是应该使您朝正确的方向前进。

dynamic "waf-configuration " {
  for_each = length(var.waf_configuration) > 0 ? [] : [1]
  content {
    enabled       = "${length(var.waf_configuration) > 0 ? lookup(var.waf_configuration, "enabled", "") : null }"
    firewall_mode = "${length(var.waf_configuration) > 0 ? lookup(var.waf_configuration, "firewall_mode", "") : null }"
  }
}