【问题标题】:How do I include/exclude optional properties within a resource block using Terraform >= 0.12如何使用 Terraform >= 0.12 在资源块中包含/排除可选属性
【发布时间】:2020-07-11 22:40:45
【问题描述】:

我对 Terraform 很陌生,但我正在尝试做一些条件逻辑来构建资源块。

到目前为止,我的天真尝试看起来像这样,希望能让您了解我的意图:

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 属性。如果它是假的,我只想要 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
  }))
}

我在构建语法正确的资源块时遇到问题。

你会如何解决这个问题?

将 max_count / min_count / node_count 设置为零或 null 不起作用,如果属性存在,Azure RM API 将返回错误,似乎唯一可行的方法是从资源块中完全排除属性。

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

    对于resource 块中的资源参数,省略一个参数并将其设置为null 是等效的,因此如果您需要“有条件地省略”一个参数,那么您可以将问题重述为有条件地将其设置为@987654323 @:

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

    这与将错误结果设为0 不同,因为null 允许提供者决定为该参数使用什么值,而0 强制将其设置为零(因此 Terraform 会考虑未来的非零值将是 drift 并计划再次将其改回)。

    【讨论】:

    • 如果可以选择两个,我也会接受你的答案作为正确的答案!
    【解决方案2】:

    您的 azurerm_kubernetes_cluster_node_pool 可以包含所有 min_count、max_count 和 node_count。如果您想不设置它们,请使用 null,它由提供者解释,就好像它们根本没有在资源块中声明一样。

    需要修正的具体参数如下:

    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
    
    • 如果 enable_auto_scalingfalse,则 ma​​x_countmin_count 默认为 null
    • 如果 enable_auto_scalingtrue,则 node_count 默认为 null

    在上下文中,这看起来像:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-03
      • 2019-04-11
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2021-09-24
      相关资源
      最近更新 更多