У меня есть один сложный объект в терраформе, структура, как показано ниже что мне нужно сделать, это преобразовать эту структуру в другую (я разместил нужную структуру), а затем создать ресурс с помощью foreach в terraform
StorageSettings{
storage{
fileshare{
directories{}
}
}
}
реальный код здесь
locals {
StorageSettings = {
CoreBackup = {
fileshare = {
shareA = {
name = "myshare"
storage_account_name = "sa1corebackup"
quota = 100
directories = {
dirA = {
name = "app"
share_name = "myshare"
storage_account_name = "sa1corebackup"
}
}
}
shareB = {
name = "myshare2"
storage_account_name = "sa1corebackup"
quota = 150
}
}
}
MGMTackup = {
fileshare = {
ShareA = {
name = "myshare"
storage_account_name = "mgmtbackup"
quota = 200
enabled_protocol = "SMB"
acl = {
id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI"
access_policy = {
permissions = "rwdl"
start = "2019-07-02T09:38:21.0000000Z"
expiry = "2019-07-02T10:38:21.0000000Z"
}
}
directories = {
dirA = {
name = "app"
share_name = "myshare"
storage_account_name = "mgmtbackup"
}
dirB = {
name = "backup"
share_name = "myshare"
storage_account_name = "mgmtbackup"
}
}
}
ShareB = {
name = "myshare2"
storage_account_name = "mgmtbackup"
quota = 100
enabled_protocol = "SMB"
acl = {
id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI"
access_policy = {
permissions = "rwdl"
start = "2019-07-02T09:38:21.0000000Z"
expiry = "2019-07-02T10:38:21.0000000Z"
}
}
directories = {
dirA = {
name = "app"
share_name = "myshare"
storage_account_name = "mgmtbackup"
}
dirB = {
name = "backup"
share_name = "myshare"
storage_account_name = "mgmtbackup"
}
}
}
}
}
}
}
Мой вопрос: как преобразовать структуру в приведенную ниже?
storage+fileshare{
directories{
}
}
Я попробовал приведенный ниже код
filesharesettings = { for p, v in local.StorageSettings : p => v.fileshare if try(v.fileshare, null) != null }
directorysettings = {
for Storage, FileShareSettings in local.filesharesettings : Storage =>
{ for FileShare, FileShareSetting in FileShareSettings : "${Storage} ${FileShare}" => FileShareSetting.directories if lookup(FileShareSetting, "directories", "") != "" }
}
но получить только такой результат
storage{
storage+fileshare{
directories{
}
}
}
выходной ток, как показано ниже, обратите внимание, что это не мой ожидаемый вывод, я попытался преобразовать структуру с некоторым кодом (уже опубликованным), и ниже приведен вывод, моя ожидаемая структура вывода такова
storage+fileshare{
directories{
}
}
Changes to Outputs:
+ dd = {
+ CoreBackup = {
+ CoreBackup shareA = {
+ dirA = {
+ name = "app"
+ share_name = "myshare"
+ storage_account_name = "sa1corebackup"
}
}
}
+ MGMTackup = {
+ MGMTackup ShareA = {
+ dirA = {
+ name = "app"
+ share_name = "myshare"
+ storage_account_name = "mgmtbackup"
}
+ dirB = {
+ name = "backup"
+ share_name = "myshare"
+ storage_account_name = "mgmtbackup"
}
}
+ MGMTackup ShareB = {
+ dirA = {
+ name = "app"
+ share_name = "myshare"
+ storage_account_name = "mgmtbackup"
}
+ dirB = {
+ name = "backup"
+ share_name = "myshare"
+ storage_account_name = "mgmtbackup"
}
}
}
}
Может ли кто-нибудь помочь мне здесь?
@Marcin, извините за неправильное понимание, уже обновил описание, вывод, как показано ниже, - это только текущий вывод, а не ожидаемый
Ваш источник данных довольно сложен, но я думаю, вы можете сделать это, используя три цикла for
:
directorysettings = merge(
flatten([for storage_name, fileshares in local.StorageSettings:
{for share_name, share in fileshares["fileshare"]:
"${storage_name}+${share_name}" => {
for directory_name, directory in share["directories"]:
directory_name => directory
} if lookup(share, "directories", "") != ""
}
])...)
что дает directorysettings
:
{
"CoreBackup+shareA" = {
"dirA" = {
"name" = "app"
"share_name" = "myshare"
"storage_account_name" = "sa1corebackup"
}
}
"MGMTackup+ShareA" = {
"dirA" = {
"name" = "app"
"share_name" = "myshare"
"storage_account_name" = "mgmtbackup"
}
"dirB" = {
"name" = "backup"
"share_name" = "myshare"
"storage_account_name" = "mgmtbackup"
}
}
"MGMTackup+ShareB" = {
"dirA" = {
"name" = "app"
"share_name" = "myshare"
"storage_account_name" = "mgmtbackup"
}
"dirB" = {
"name" = "backup"
"share_name" = "myshare"
"storage_account_name" = "mgmtbackup"
}
}
}
довольно сложное выражение .. оно работает, большое спасибо!
@mxy Да, но ваша структура данных тоже сложна. Вам придется упростить его, чтобы упростить код TF.
«Вывод, как показано ниже» - это ваш ожидаемый результат или текущий вывод, который неверен?