【问题标题】:Unable to Input list variable values in Terraform无法在 Terraform 中输入列表变量值
【发布时间】:2021-08-25 13:08:46
【问题描述】:

我正在尝试使用 Terraform 创建 CosmosDB,并为子网使用列表变量类型,因为我们在 VNET 中有多个子网。但是我遇到了错误-

var.subnet 是包含 2 个元素的字符串列表

│不能在字符串模板中包含给定值:需要字符串。

我的 variable.tf 和 main.tf 在这里-

# ================
# Variable.tf
# ==============
variable "vnet" {
  description = "Provide VNET Name"
  default     = "cosmosdb-icn-vnet"
}

variable "subnet" {
  description = "Specifies subnet name"
  type        = list(string)
}

# ====================
# main.tf
# ===================
resource "azurerm_cosmosdb_account" "db" {
  name                              = "cosmosdb-${var.environment}"
  location                          = var.location
  resource_group_name               = var.rgname
  offer_type                        = "Standard"
  enable_automatic_failover         = true
  is_virtual_network_filter_enabled = true
 
  consistency_policy {
    consistency_level = "Session"
  }

  tags = {
    ENVIRONMENT = var.environment
  }

  backup {
    type                = var.backuptype
    interval_in_minutes = "60"
    retention_in_hours  = "8"
  }

  virtual_network_rule {
    id                                   = "/subscriptions/${var.subscription}/resourceGroups/${var.rgname}/providers/Microsoft.Network/virtualNetworks/${var.vnet}/subnets/${var.subnet}"
    ignore_missing_vnet_service_endpoint = true

  }

  geo_location {
    location          = var.failover_location
    failover_priority = 0
  }

}

我正在使用以下命令进行应用

terraform apply -var='subnet=["deafult", "cosmosdb2.0"]'

【问题讨论】:

  • 你的var.subnet在字符串中使用,所以不能输入列表,必须输入字符串。你到底想得到什么?
  • 嗨@LazyEval - 我正在尝试创建 CosmosDB 并传递子网和 vnet。我也尝试以不同的方式传递子网,但没有奏效。所以用这种方式。
  • 嗨 @LazyEval - 我们在 VNET 中有多个子网,因此在这里传递单个字符串不起作用。我需要传递一份清单,所以请在这里帮助我

标签: terraform terraform-provider-azure terraform0.12+


【解决方案1】:

您应该尝试分离两个子网,从而在资源中创建两个virtual_network_rule 块:

# ================
# Variable.tf
# ==============
variable "vnet" {
  description = "Provide VNET Name"
  default     = "cosmosdb-icn-vnet"
}

variable "subnets" {
  description = "Specifies subnet names"
  type        = list(string)
}

# ====================
# main.tf
# ===================
resource "azurerm_cosmosdb_account" "db" {
  name                              = "cosmosdb-${var.environment}"
  location                          = var.location
  resource_group_name               = var.rgname
  offer_type                        = "Standard"
  enable_automatic_failover         = true
  is_virtual_network_filter_enabled = true
 
  consistency_policy {
    consistency_level = "Session"
  }

  tags = {
    ENVIRONMENT = var.environment
  }

  backup {
    type                = var.backuptype
    interval_in_minutes = "60"
    retention_in_hours  = "8"
  }

  dynamic "virtual_network_rule" {
  for_each = var.subnets
    id                                   = "/subscriptions/${var.subscription}/resourceGroups/${var.rgname}/providers/Microsoft.Network/virtualNetworks/${var.vnet}/subnets/${virtual_network_rule.value}"
    ignore_missing_vnet_service_endpoint = true
  }

  geo_location {
    location          = var.failover_location
    failover_priority = 0
  }

}

【讨论】:

  • 嗨@LazyEval - 感谢您的帮助。但这行不通,因为为了测试我采用了两个子网,但我们有超过 5-6 个子网。所以创建 5-6 个变量不是一个好习惯。你能请我任何其他方法吗?
  • 使 EDIT 创建了一个动态块。试试看
  • 当我尝试关注 azurerm_cosmosdb_account 备份 { type = "Periodic" interval_in_minutes = "80" } 。我收到错误,因为“这里不需要备份类型的块。有没有人看到这个错误
  • 你试过在terraform plan/apply之前运行terraform fmt吗?您必须确保格式正确
猜你喜欢
  • 2020-06-09
  • 2021-01-18
  • 2019-09-15
  • 2020-09-05
  • 1970-01-01
  • 2020-07-10
  • 2019-11-19
  • 2022-06-22
  • 1970-01-01
相关资源
最近更新 更多