Database Terraform布尔变量true-基于映射值 预期行为

Database Terraform布尔变量true-基于映射值 预期行为,database,azure,terraform,terraform-provider-aws,terraform-provider-azure,Database,Azure,Terraform,Terraform Provider Aws,Terraform Provider Azure,我想根据映射值的输出,将布尔变量“var.ds\u allmetrics\u retention\u days”设置为true 实际行为 抛出错误(请参阅错误输出) 错误输出 Terraform(和AzureRM提供程序)版本 受影响的资源 azurerm_v2.41.0 TerraformV0.13.0 地形配置文件 Main.tf data "azurerm_storage_account" "storage_account" { name

我想根据映射值的输出,将布尔变量“var.ds\u allmetrics\u retention\u days”设置为true

实际行为 抛出错误(请参阅错误输出)

错误输出 Terraform(和AzureRM提供程序)版本 受影响的资源
  • azurerm_v2.41.0
  • TerraformV0.13.0
地形配置文件 Main.tf

data "azurerm_storage_account" "storage_account" {
  name                = var.storage_account
  resource_group_name = var.sa_resource_group
}

resource "azurerm_monitor_diagnostic_setting" "diagsetting" {
  name               = var.target_resource_name
  target_resource_id = var.target_resource_id
  storage_account_id = data.azurerm_storage_account.storage_account.id

  dynamic "log" {
    for_each = keys(var.ds_log_api_endpoints)
    content {
      category = log.value
      enabled  = true

      retention_policy {
        enabled = var.enable_retention_policy
        days    = lookup(var.ds_log_api_endpoints, log.value, 0)
      }
    }
  }

  dynamic "metric" {
    for_each = keys(var.ds_allmetrics_retention_days)
    content {
      category = metric.value

      retention_policy {
        enabled = var.enable_retention_policy
        days    = lookup(var.ds_allmetrics_retention_days, metric.value, 0)
      }
    }
  }
}

# boolean variable
variable "enable_retention_policy" {
  type        = bool
  description = "toggle on/off the retention policy for the metric"
  default     = false
}

# mapped values
variable "ds_allmetrics_retention_days" {
  type        = map
  description = "Azure monitor diagnostic setting category for retention in days of target resource."
  default     = {}
}
变量。tf

data "azurerm_storage_account" "storage_account" {
  name                = var.storage_account
  resource_group_name = var.sa_resource_group
}

resource "azurerm_monitor_diagnostic_setting" "diagsetting" {
  name               = var.target_resource_name
  target_resource_id = var.target_resource_id
  storage_account_id = data.azurerm_storage_account.storage_account.id

  dynamic "log" {
    for_each = keys(var.ds_log_api_endpoints)
    content {
      category = log.value
      enabled  = true

      retention_policy {
        enabled = var.enable_retention_policy
        days    = lookup(var.ds_log_api_endpoints, log.value, 0)
      }
    }
  }

  dynamic "metric" {
    for_each = keys(var.ds_allmetrics_retention_days)
    content {
      category = metric.value

      retention_policy {
        enabled = var.enable_retention_policy
        days    = lookup(var.ds_allmetrics_retention_days, metric.value, 0)
      }
    }
  }
}

# boolean variable
variable "enable_retention_policy" {
  type        = bool
  description = "toggle on/off the retention policy for the metric"
  default     = false
}

# mapped values
variable "ds_allmetrics_retention_days" {
  type        = map
  description = "Azure monitor diagnostic setting category for retention in days of target resource."
  default     = {}
}
模块调用

module "diagnostic_mssql_db" {
  source                  = "github.com/faraday23/terraform-azurerm-monitor-diagnostic-setting.git"
  storage_account         = var.storage_account
  sa_resource_group       = var.sa_resource_group
  target_resource_id      = azurerm_mssql_database.db.id
  target_resource_name    = azurerm_mssql_database.db.name
  enable_retention_policy = var.enable_retention_policy
  ds_log_api_endpoints = { "AutomaticTuning" = var.automatic_tuning > 0 ? var.automatic_tuning : var.enable_retention_policy,
    "Blocks"                      = var.blocks > 0 ? var.blocks : var.enable_retention_policy,
    "DatabaseWaitStatistics"      = var.database_wait_statistics > 0 ? var.database_wait_statistics : var.enable_retention_policy,
    "Deadlocks"                   = var.deadlocks > 0 ? var.deadlocks : var.enable_retention_policy,
    "Errors"                      = var.error_log > 0 ? var.error_log : var.enable_retention_policy,
    "Timeouts"                    = var.timeouts > 0 ? var.timeouts : var.enable_retention_policy,
    "QueryStoreRuntimeStatistics" = var.query_store_runtime_statistics > 0 ? var.query_store_runtime_statistics : var.enable_retention_policy,
    "QueryStoreWaitStatistics"    = var.query_store_wait_statistics > 0 ? var.query_store_wait_statistics : var.enable_retention_policy,
    "SQLInsights"                 = var.sql_insights > 0 ? var.sql_insights : var.enable_retention_policy
  }

  ds_allmetrics_retention_days = { "Basic" = var.basic > 0 ? var.basic : var.enable_retention_policy,
    "InstanceAndAppAdvanced" = var.instance_and_app_advanced > 0 ? var.instance_and_app_advanced : var.enable_retention_policy,
    "WorkloadManagement"     = var.workload_management > 0 ? var.workload_management : var.enable_retention_policy
  }
}

错误消息表明问题出在
工作负载管理
上。在你的例子中,你有混合的
bool
int
,这是不正确的必须是相同类型的

这两个结果值可以是任何类型,但它们必须是同一类型,以便Terraform可以在不知道条件值的情况下确定整个条件表达式将返回的类型

因此,您可以使用将
bool
更改为
int

基于马丁评论的更新

原始答案使用了
tonumber(var.enable\u retention\u policy)
,这是不正确的,因为您无法将
bool
转换为数字。正确答案是:

"WorkloadManagement" = (var.workload_management > 0 
                       ? var.workload_management 
                       : (var.enable_retention_policy ? 1 : 0))

Terraform语言不允许从bool到number的转换,因此我认为与原始示例相比,最小的工作变化应该是嵌套条件,尽管它有点难以理解:
var.workload\u management>0?var.workload\u management:(var.enable\u retention\u policy?1:0)
。我可能会尝试重构,这样这个表达式就不需要这么复杂了,但我不确定用给出的信息来代替它该建议什么。@MartinAtkins谢谢,但我不确定bool不能转换为数字是什么意思?代码工作正常,执行正常。
tonumber(true)
返回错误
v参数的无效值:无法将布尔值转换为数字。
@MartinAtkins我明白了。你是对的。我的错误。如果你愿意的话,你可以提供一个答案,我将把它投上一票并删除我的答案?你的答案是正确的,使结果都具有相同的类型,而实现这一点的方法在比较中似乎是一个小细节,所以我不认为我有必要为了这个小更正而重复你所有的答案。如果您愿意,请随意编辑您的答案,以包含类似我建议的备选方案的内容!