Database Terraform布尔变量true-基于映射值 预期行为
我想根据映射值的输出,将布尔变量“var.ds\u allmetrics\u retention\u days”设置为true 实际行为 抛出错误(请参阅错误输出) 错误输出 Terraform(和AzureRM提供程序)版本 受影响的资源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
azurerm_v2.41.0
TerraformV0.13.0
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我明白了。你是对的。我的错误。如果你愿意的话,你可以提供一个答案,我将把它投上一票并删除我的答案?你的答案是正确的,使结果都具有相同的类型,而实现这一点的方法在比较中似乎是一个小细节,所以我不认为我有必要为了这个小更正而重复你所有的答案。如果您愿意,请随意编辑您的答案,以包含类似我建议的备选方案的内容!