我对 Terraform 还很陌生,但我正在尝试执行一些条件逻辑来构建资源 block 。
到目前为止,我的天真的尝试看起来像这样,希望能让您了解我的意图:
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 为 true,我想要拥有 max_count 和 min_count 属性。如果它是假的,我只想要node_count。
如果没有条件逻辑,当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
}))
}
我在构建语法正确的资源 block 时遇到问题。
你会如何解决这个问题?
将 max_count/min_count/node_count 设置为零或 null 不起作用,如果属性存在,Azure RM API 将返回错误,似乎唯一有效的方法是从资源 block 中完全排除属性。
最佳答案
对于 resource
block 中资源的参数,省略参数并将其设置为 null
是等效的,因此如果您需要“有条件地省略”参数,那么您可以将问题重述为有条件地将其设置为 null
:
var.node_pools[count.index].enable_auto_scaling ? var.node_pools[count.index].min_count : null
这与错误结果为 0
不同,因为 null
允许提供者决定该参数使用什么值,而 0
code> 强制将其设置为零(因此 Terraform 将认为 future 的非零值漂移并计划再次将其更改回来)。
关于terraform - 如何使用 Terraform >= 0.12 在资源 block 中包含/排除可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62835800/