为 Azure 存储帐户中的每个循环嵌套的地形
terraform nested for each loop in azure storage account
我想创建多个存储帐户,并在每个存储帐户中创建一些容器。
如果我想要 3 个存储帐户,我总是想在这 3 个存储帐户中创建 container-a 和 container-b
所以例如会是。存储帐户列表 ["sa1","sa2","sa3"].
resource "azurerm_storage_account" "storage_account" {
count = length(var.list)
name = var.name
resource_group_name = module.storage-account-resource-group.resource_group_name[0]
location = var.location
account_tier = var.account_tier
account_kind = var.account_kind
然后是容器块
resource "azurerm_storage_container" "container" {
depends_on = [azurerm_storage_account.storage_account]
count = length(var.containers)
name = var.containers[count.index].name
container_access_type = var.containers[count.index].access_type
storage_account_name = azurerm_storage_account.storage_account[0].name
容器变量:
variable "containers" {
type = list(object({
name = string
access_type = string
}))
default = []
description = "List of storage account containers."
}
列表变量
variable "list" {
type = list(string)
description = "the env to deploy. ['dev','qa','prod']"
此代码将只在第一个存储帐户“sa1”中创建一个容器,而不会在其他两个“sa2”和“sa3”中创建。我读到我需要为每个使用 2 来迭代存储帐户和容器列表,但不确定它的代码应该如何。
最好用for_each
:
resource "azurerm_storage_account" "storage_account" {
for_each = toset(var.list)
name = var.name
resource_group_name = module.storage-account-resource-group.resource_group_name[0]
location = var.location
account_tier = var.account_tier
account_kind = var.account_kind
}
那么你需要相当于一个 double for
循环 ,你可以使用 setproduct:
locals {
flat_list = setproduct(var.list, var.containers)
}
然后您使用 local.flat_list
作为容器:
resource "azurerm_storage_container" "container" {
for_each = {for idx, val in local.flat_list: idx => val}
name = each.value.name[1].name
container_access_type = each.value.name[1].access_type
storage_account_name = azurerm_storage_account.storage_account[each.value[0]].name
}
p.s。我没有 运行 代码,因此可能需要进行一些调整,但这个想法仍然有效。
我想创建多个存储帐户,并在每个存储帐户中创建一些容器。 如果我想要 3 个存储帐户,我总是想在这 3 个存储帐户中创建 container-a 和 container-b
所以例如会是。存储帐户列表 ["sa1","sa2","sa3"].
resource "azurerm_storage_account" "storage_account" {
count = length(var.list)
name = var.name
resource_group_name = module.storage-account-resource-group.resource_group_name[0]
location = var.location
account_tier = var.account_tier
account_kind = var.account_kind
然后是容器块
resource "azurerm_storage_container" "container" {
depends_on = [azurerm_storage_account.storage_account]
count = length(var.containers)
name = var.containers[count.index].name
container_access_type = var.containers[count.index].access_type
storage_account_name = azurerm_storage_account.storage_account[0].name
容器变量:
variable "containers" {
type = list(object({
name = string
access_type = string
}))
default = []
description = "List of storage account containers."
}
列表变量
variable "list" {
type = list(string)
description = "the env to deploy. ['dev','qa','prod']"
此代码将只在第一个存储帐户“sa1”中创建一个容器,而不会在其他两个“sa2”和“sa3”中创建。我读到我需要为每个使用 2 来迭代存储帐户和容器列表,但不确定它的代码应该如何。
最好用for_each
:
resource "azurerm_storage_account" "storage_account" {
for_each = toset(var.list)
name = var.name
resource_group_name = module.storage-account-resource-group.resource_group_name[0]
location = var.location
account_tier = var.account_tier
account_kind = var.account_kind
}
那么你需要相当于一个 double for
循环 ,你可以使用 setproduct:
locals {
flat_list = setproduct(var.list, var.containers)
}
然后您使用 local.flat_list
作为容器:
resource "azurerm_storage_container" "container" {
for_each = {for idx, val in local.flat_list: idx => val}
name = each.value.name[1].name
container_access_type = each.value.name[1].access_type
storage_account_name = azurerm_storage_account.storage_account[each.value[0]].name
}
p.s。我没有 运行 代码,因此可能需要进行一些调整,但这个想法仍然有效。