Terraform условия в модуле - PullRequest
       30

Terraform условия в модуле

0 голосов
/ 16 января 2020

Я пытаюсь создать простую логику c при вызове модуля шлюза 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, то должны быть указаны следующие настройки, а если нет, то null?

Ответы [ 2 ]

1 голос
/ 21 января 2020

При работе с Terraform мы часто хотим перефразировать проблемы, связанные с условным тестом, в проблемы, связанные с коллекцией, которая может содержать или не содержать элементы, потому что возможности языка Terraform ориентированы на преобразование коллекций в конфигурацию поэлементно. .

В вашем случае у вас есть переменная, которая уже является списком, поэтому она может просто гарантировать, что ее значением по умолчанию является пустой список, а не null, и, таким образом, вы можете просто сгенерировать один waf_configuration блок на элемент:

variable "waf_configuration" {
  type = list(object({
    enabled       = bool
    firewall_mode = string
  }))
  default = []
}

Затем вы можете использовать dynamic block для генерации одного waf_configuration блока на элемент этого списка:

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

Хотя это, кажется, не относится к этому конкретному примеру, другой распространенный шаблон - это переменная, которая может быть установлена ​​для включения чего-либо или оставлена ​​неустановленной для ее отключения. Например, если ваш модуль предназначен для использования только одиночной необязательной конфигурации WAF, вы можете определить переменную следующим образом:

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

Как отмечалось выше, лучший способ работы с что-то подобное в Terraform - это преобразовать его в список, который может быть пустым. Поскольку это обычная ситуация, для нее есть сокращение с помощью выражений сплат :

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

Когда мы применяем оператор [*] к значению, не относящемуся к списку / не установленный тип, Terraform проверит, является ли значение null. Если равно null, то результатом будет пустой список, а если не null, то результатом будет одноэлементный список, содержащий это одно значение.

После преобразования в список мы можем использовать его в аргументе for_each в dynamic обычным способом, получая доступ к атрибутам из этого возможного единственного элемента внутри блока content. Нам не нужно повторять условные выражения для каждого аргумента, поскольку содержимое блока content оценивается только тогда, когда список не пуст.

1 голос
/ 16 января 2020

Я бы посоветовал вам перейти на Terraform v0.12.x, и это должно стать намного проще. Я бы использовал новый синтаксис блока Dynami c, чтобы сделать блок необязательным, основываясь на любых условиях, которые вам нужно использовать.

Вот примерный пример, но вы должны двигаться в правильном направлении.

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 }"
  }
}
...