Как включить / исключить необязательные свойства в блоке ресурсов с помощью Terraform> = 0.12 - PullRequest
1 голос
/ 10 июля 2020

Я новичок в Terraform, но я пытаюсь сделать некоторые условные логические c, чтобы создать блок ресурсов.

Пока моя наивная попытка выглядит так, что, надеюсь, дает вам представление моего намерения:

resource "azurerm_kubernetes_cluster_node_pool" "node_pools" {
  { for pool in var.node_pools:
    kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
    name                  = pool.name
    vm_size               = pool.vm_size
    max_pods              = pool.max_pods
    vnet_subnet_id        = "${data.azurerm_virtual_network.vnet.id}/subnets/${pool.vnet_subnet_name}"
    os_type               = pool.os_type
    os_disk_size_gb       = pool.os_disk_size_gb
    node_taints           = pool.node_taints
    availability_zones    = pool.availability_zones
    node_labels           = pool.node_labels
    enable_auto_scaling   = pool.enable_auto_scaling
    max_count             = pool.max_count
    min_count             = pool.min_count
    if pool.enable_auto_scaling
  }
    { for pool in var.node_pools:
    kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
    name                  = pool.name
    vm_size               = pool.vm_size
    max_pods              = pool.max_pods
    vnet_subnet_id        = "${data.azurerm_virtual_network.vnet.id}/subnets/${pool.vnet_subnet_name}"
    os_type               = pool.os_type
    os_disk_size_gb       = pool.os_disk_size_gb
    node_taints           = pool.node_taints
    availability_zones    = pool.availability_zones
    node_labels           = pool.node_labels
    enable_auto_scaling   = pool.enable_auto_scaling
    node_count            = pool.count
    if !pool.enable_auto_scaling
  }
}

Если pool.enable_auto_scaling истинно, я хочу иметь свойства max_count и min_count. Если это false, мне просто нужен node_count.

Без условного logi c это может выглядеть примерно так, когда enable_auto_scaling == true:

resource "azurerm_kubernetes_cluster_node_pool" "node_pools" {
  count                 = length(var.node_pools)
  kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
  name                  = var.node_pools[count.index].name
  vm_size               = var.node_pools[count.index].vm_size
  max_pods              = var.node_pools[count.index].max_pods
  vnet_subnet_id        = "${data.azurerm_virtual_network.vnet.id}/subnets/${var.node_pools[count.index].vnet_subnet_name}"
  os_type               = var.node_pools[count.index].os_type
  os_disk_size_gb       = var.node_pools[count.index].os_disk_size_gb
  node_taints           = var.node_pools[count.index].node_taints
  availability_zones    = var.node_pools[count.index].availability_zones
  node_labels           = var.node_pools[count.index].node_labels
  enable_auto_scaling   = var.node_pools[count.index].enable_auto_scaling
  max_count             = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].max_count : 0
  min_count             = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : 0
}

И когда enable_auto_scaling == false:

resource "azurerm_kubernetes_cluster_node_pool" "node_pools" {
  count                 = length(var.node_pools)
  kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
  name                  = var.node_pools[count.index].name
  vm_size               = var.node_pools[count.index].vm_size
  max_pods              = var.node_pools[count.index].max_pods
  vnet_subnet_id        = "${data.azurerm_virtual_network.vnet.id}/subnets/${var.node_pools[count.index].vnet_subnet_name}"
  os_type               = var.node_pools[count.index].os_type
  os_disk_size_gb       = var.node_pools[count.index].os_disk_size_gb
  node_taints           = var.node_pools[count.index].node_taints
  availability_zones    = var.node_pools[count.index].availability_zones
  node_labels           = var.node_pools[count.index].node_labels
  enable_auto_scaling   = var.node_pools[count.index].enable_auto_scaling
  node_count            = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : var.node_pools[count.index].count
}

Мой файл variables.tf содержит переменную, определенную следующим образом:

variable "node_pools" {
  type = list(object({
    name                = string
    count               = number
    vm_size             = string
    max_pods            = number
    vnet_subnet_name    = string
    os_type             = string
    os_disk_size_gb     = number
    node_taints         = list(string)
    availability_zones  = list(string)
    node_labels         = map(string)
    enable_auto_scaling = bool
    max_count           = number
    min_count           = number
  }))
}

У меня проблемы с построением синтаксически правильного блока ресурсов.

Как бы вы решили эта проблема?

Установка max_count / min_count / node_count в ноль или ноль не работает, Azure RM API вернет ошибки, если свойства присутствуют, кажется, единственный способ, которым это работает, - исключить свойства из ресурсный блок целиком.

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Для аргументов ресурсов в блоках resource исключение аргумента и установка его на null эквивалентны, поэтому, если вам нужно «условно опустить» аргумент, вы можете переформулировать проблему, установив для него условно null:

var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : null

Это отличается от ложного результата 0, потому что null позволяет провайдеру решать, какое значение использовать для этого аргумента, а 0 заставляет его установить до нуля (и поэтому Terraform будет считать будущее ненулевое значение дрейфом и планирует снова изменить его).

1 голос
/ 11 июля 2020

В вашем azurerm_kubernetes_cluster_node_pool могут быть все значения min_count, max_count и node_count. Если вы хотите оставить их незаданными, используйте null , что интерпретируется поставщиком, как если бы они вообще не были объявлены в блоке ресурсов.

Указанные c аргументы, которые необходимы исправления следующие:

max_count  = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].max_count : null
min_count  = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : null
node_count = var.node_pools[count.index].enable_auto_scaling ? null: var.node_pools[count.index].count
  • max_count и min_count по умолчанию null if enable_auto_scaling is false
  • node_count по умолчанию null , если enable_auto_scaling равно true

В контексте это будет выглядеть так:

resource "azurerm_kubernetes_cluster_node_pool" "node_pools" {
  count                 = length(var.node_pools)
  kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
  name                  = var.node_pools[count.index].name
  vm_size               = var.node_pools[count.index].vm_size
  max_pods              = var.node_pools[count.index].max_pods
  vnet_subnet_id        = "${data.azurerm_virtual_network.vnet.id}/subnets/${var.node_pools[count.index].vnet_subnet_name}"
  os_type               = var.node_pools[count.index].os_type
  os_disk_size_gb       = var.node_pools[count.index].os_disk_size_gb
  node_taints           = var.node_pools[count.index].node_taints
  availability_zones    = var.node_pools[count.index].availability_zones
  node_labels           = var.node_pools[count.index].node_labels
  enable_auto_scaling   = var.node_pools[count.index].enable_auto_scaling
  max_count             = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].max_count : null
  min_count             = var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : null
  node_count            = var.node_pools[count.index].enable_auto_scaling ? null: var.node_pools[count.index].count
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...