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

时间:2020-07-10 13:52:13

标签: terraform terraform-provider-azure

对于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为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
  }))
}

我在构建语法上正确的资源块时遇到了麻烦。

您将如何解决此问题?

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

2 个答案:

答案 0 :(得分:2)

对于resource块中资源的参数,省略参数并将其设置为null是等效的,因此,如果您需要“有条件地省略”参数,则可以将问题重新声明为有条件地设置它发送到null

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

这与将错误结果设为0不同,因为null允许提供程序决定对该参数使用什么值,而0则将其设置为零(因此Terraform会将未来的非零值视为漂移并计划再次将其改回。)

答案 1 :(得分:1)

您的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_scaling false ,则
  • max_count min_count 默认为。 li> 如果 enable_auto_scaling true
  • node_count 默认为

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

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
}