Я новичок в 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 вернет ошибки, если свойства присутствуют, кажется, единственный способ, которым это работает, - исключить свойства из ресурсный блок целиком.