terraform - 如何使用 Terraform >= 0.12 在资源 block 中包含/排除可选属性

标签 terraform terraform-provider-azure

我对 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/

相关文章:

terraform - 使用 Vault 加密存储在 Consul 中的远程 Terraform 状态

azure - 通过自动化为多个资源组上的托管身份添加 RBAC 角色

azure - 来自本地脚本的 Terraform Azure VM 扩展自定义脚本

azure - Terraform Azure - 加载插件组件的架构时出错 : Failed to obtain provider schema:

azure - 使用 Terraform 为虚拟 secret 码创建 Key Vault secret

azure-devops - terraform 提供程序导致 TypeError : Cannot read property 'match' of null

amazon-elb - ECS 和应用程序负载均衡器未使用 Terraform 注册临时端口

google-cloud-platform - GCP 上的 Terraform 共享 VPC - 静态内部 IP 地址

terraform - 如何使用 terraform 在 for 循环中创建多个资源?

mysql - 如何使用 Terraform 管理数据库服务器