如果 terraform 中的条件计数
if condition in terraform in count
我正在 Azure cosmosdb 数据库中添加自动缩放设置,我的问题是并非我们所有的数据库都需要自动缩放只有一部分数据库需要自动缩放其余是手动的。我将无法在同一资源中始终指定 autoscalse 块,因为这两者之间存在冲突。所以我想到了使用计数,但我将无法 运行 只有一个数据库的资源块。对于下面的例子
变量
variable "databases" {
description = "The list of Cosmos DB SQL Databases."
type = list(object({
name = string
throughput = number
autoscale = bool
max_throughput = number
}))
default = [
{
name = "testcoll1"
throughput = 400
autoscale = false
max_throughput = 0
},
{
name = "testcoll2"
throughput = 400
autoscale = true
max_throughput = 1000
}
]
}
第一个我不需要自动缩放,下一个我需要。我的main.tf代码
resource "azurerm_cosmosdb_mongo_database" "database_manual" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
throughput = var.databases[count.index].throughput
}
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
autoscale_settings {
max_throughput = var.databases[count.index].max_throughput
}
}
首先我想到了运行宁两个块,一个有秤,一个没有,但我将无法继续,因为它需要计数
count = var.autoscale_required == true ? len(databases) : 0
一开始,但就我而言,我只会在迭代时知道。我尝试在块中使用动态但出错了。
*更新
我已经切换到 foreach 并且能够达到 运行 条件,但它仍然需要 2 个块
资源“azurerm_cosmosdb_mongo_database”“database_autoscale”
资源“azurerm_cosmosdb_mongo_database”“database_manual”
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
for_each = {
for key, value in var.databases : key => value
if value.autoscale_required == true }
name = each.value.name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
autoscale_settings {
max_throughput = each.value.max_throughput
}
}
如果我没理解错的话,我想你可以用下面的方法做你想做的事:
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
throughput = var.databases[count.index].autoscale == false ? var.databases[count.index].throughput : null
dynamic "autoscale_settings" {
for_each = var.databases[count.index].autoscale == false ? [] : [1]
content {
max_throughput = var.databases[count.index].max_throughput
}
}
}
我正在 Azure cosmosdb 数据库中添加自动缩放设置,我的问题是并非我们所有的数据库都需要自动缩放只有一部分数据库需要自动缩放其余是手动的。我将无法在同一资源中始终指定 autoscalse 块,因为这两者之间存在冲突。所以我想到了使用计数,但我将无法 运行 只有一个数据库的资源块。对于下面的例子
变量
variable "databases" {
description = "The list of Cosmos DB SQL Databases."
type = list(object({
name = string
throughput = number
autoscale = bool
max_throughput = number
}))
default = [
{
name = "testcoll1"
throughput = 400
autoscale = false
max_throughput = 0
},
{
name = "testcoll2"
throughput = 400
autoscale = true
max_throughput = 1000
}
]
}
第一个我不需要自动缩放,下一个我需要。我的main.tf代码
resource "azurerm_cosmosdb_mongo_database" "database_manual" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
throughput = var.databases[count.index].throughput
}
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
autoscale_settings {
max_throughput = var.databases[count.index].max_throughput
}
}
首先我想到了运行宁两个块,一个有秤,一个没有,但我将无法继续,因为它需要计数
count = var.autoscale_required == true ? len(databases) : 0
一开始,但就我而言,我只会在迭代时知道。我尝试在块中使用动态但出错了。
*更新 我已经切换到 foreach 并且能够达到 运行 条件,但它仍然需要 2 个块 资源“azurerm_cosmosdb_mongo_database”“database_autoscale” 资源“azurerm_cosmosdb_mongo_database”“database_manual”
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
for_each = {
for key, value in var.databases : key => value
if value.autoscale_required == true }
name = each.value.name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
autoscale_settings {
max_throughput = each.value.max_throughput
}
}
如果我没理解错的话,我想你可以用下面的方法做你想做的事:
resource "azurerm_cosmosdb_mongo_database" "database_autoscale" {
count = length(var.databases)
name = var.databases[count.index].name
resource_group_name = azurerm_cosmosdb_account.cosmosdb.resource_group_name
account_name = local.account_name
throughput = var.databases[count.index].autoscale == false ? var.databases[count.index].throughput : null
dynamic "autoscale_settings" {
for_each = var.databases[count.index].autoscale == false ? [] : [1]
content {
max_throughput = var.databases[count.index].max_throughput
}
}
}