简体   繁体   中英

how to use Loops in Terraform to deploy 2 different azure resources

I'm currently writing some Terraform code that deploys Azure Datalake Gen2 Storage Filesystem and folder structure for each filesystem.

Below code works fine when creating all the filesystems declared in the variable list.

variable.tf

variable "product_unified_filesystem" {
   default =  [
     "product1",
     "product2",
     "product3"
     ]
}

variable "product_unified_subdirs" {
  default = [
    "subdirectory1",
    "subdirectory2",
    "subdirectory3"
  ]
}

main.tf

resource "azurerm_storage_data_lake_gen2_filesystem" "unified-filesystem" {
  count              = length(var.product_unified_filesystem)
  name               = var.product_unified_filesystem[count.index] 
  storage_account_id = module.storage.id
}

resource "azurerm_storage_data_lake_gen2_path" "unified-subdirs-1" {
  count              = length(var.product_unified_subdirs)
  path               = var.product_unified_subdirs[count.index]  
  filesystem_name    = "product1"
  storage_account_id = module.storage.id
  resource           = "directory"
  }
}
resource "azurerm_storage_data_lake_gen2_path" "unified-subdirs-2" {
  count              = length(var.product_unified_subdirs)
  path               = var.product_unified_subdirs[count.index]  
  filesystem_name    = "product2"
  storage_account_id = module.storage.id
  resource           = "directory"
  }
}

resource "azurerm_storage_data_lake_gen2_path" "unified-subdirs-3" {
  count              = length(var.product_unified_subdirs)
  path               = var.product_unified_subdirs[count.index]  
  filesystem_name    = "product3"
  storage_account_id = module.storage.id
  resource           = "directory"
  }
}

Now I want to create a common sub folder structure each of the product file system created above.

Above Code works when I pass one filesystem at a time to create the folder structure.

I want to loop through both variables and create a folder structure as shown below.

  • product1 subdirectory1 subdirectory2 subdirectory3
  • product2 subdirectory1 subdirectory2 subdirectory3
  • product3 subdirectory1 subdirectory2 subdirectory3

You can use setproduct to get all combinations. Also its better to use for_each instead of count as it does not depend on ordering of items.

locals {
  fs_subdir = {
    for val in setproduct(var.product_unified_filesystem, var.product_unified_subdirs):
      "${val[0]}-${val[1]}" => {
        product = val[0]
        subdir = val[1]
      }
  }
}

then


resource "azurerm_storage_data_lake_gen2_filesystem" "unified-filesystem" {
  for_each           = toset(var.product_unified_filesystem)
  name               = each.key
  storage_account_id = module.storage.id
}

resource "azurerm_storage_data_lake_gen2_path" "unified-subdirs" {
  for_each           = local.fs_subdir
  path               = each.value.subdir
  filesystem_name    = each.value.product
  storage_account_id = module.storage.id
  resource           = "directory"
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM