gpt4 book ai didi

azure - 2种不同的terraform动态声明方式,有什么区别

转载 作者:行者123 更新时间:2023-12-03 05:21:04 24 4
gpt4 key购买 nike

我遇到过 2 种 terraform 动态语法,只是想知道有什么区别?

dynamic "storage_account" {
for_each = var.storage_account == null ? {} : var.storage_account
content {
name = storage_account.value.name
type = storage_account.value.type
account_name = storage_account.value.account_name
share_name = storage_account.value.share_name
access_key = storage_account.value.access_key
mount_path = storage_account.value.mount_path
}
}

dynamic "backup" {
for_each = var.app_service_backup != null ? [1] : []
content {
name = var.app_service_backup.name
enabled = true
storage_account_url = var.app_service_backup.storage_account_url
schedule {
frequency_interval = var.app_service_backup.frequency_interval
frequency_unit = var.app_service_backup.frequency_unit
}
}
}

变量是

variable "storage_account" {
description = <<EOF
(Optional) - One or more storage_account blocks as defined below.

(Required) name - The name of the storage account identifier.
(Required) type - The type of storage. Possible values are AzureBlob and AzureFiles.
(Required) account_name - The name of the storage account.
(Required) share_name - The name of the file share (container name, for Blob storage).
(Required) access_key - The access key for the storage account.
(Required) mount_path - The path to mount the storage within the site's runtime environment.
EOF
type = map(object({
name = string
type = string
account_name = string
share_name = string
access_key = string
mount_path = string
}))

default = null
}


variable "app_service_backup" {
description = <<EOF
(Optional) - The app service backup block supports the following:

(Required) name - Specifies the name for this Backup.
(Required) storage_account_url - The SAS URL to a Storage Container where Backups should be saved.
(Required) frequency_interval - Sets how often the backup should be executed.
(Required) frequency_unit - Sets the unit of time for how often the backup should be executed. Possible values are Day or Hour.
EOF

type = object({
name = string
storage_account_url = string
frequency_interval = number
frequency_unit = string

})

default = null
}

注意第一个动态 storage_account 如何使用 storage_account.value.name 等内容第二个“备份”使用 var.app_service_backup.name

对于第二个,我可以使用 backup.value.name 吗?

最佳答案

当你有Conditional Expression时在 TF 中,例如

条件? true_val : false_val

true_valfalse_val 必须是相同类型

所以在你的第一个例子中:

for_each = var.storage_account == null ? {} : var.storage_account

var.storage_account 是映射,因此 true_val 也必须是map。在本例中,它是一个空的map {}。由于此映射没有任何元素,因此 for_each 将不会运行。

在你的第二个示例中,也可以使用 map ,但是列表写起来更短,所以你有(只是一个约定):

 for_each = var.app_service_backup != null ? [1] : []

其中 [] 是一个空列表,[1] 是一个包含一个元素的列表。因此 for_each 只会运行一次。列表[1]中元素的值为1,但这确实无关紧要。它可以是任何值,只要列表的长度不为零。

更新

在第二个示例中不能使用 backup.value.name,因为在这种情况下 backup.value 实际上是 1它的值来自 [1]。此外,强制更改 for_each 以使用 var.app_service_backup 是没有意义的,因为它只是一个值。它不需要迭代。所以你只需直接访问它即可。

关于azure - 2种不同的terraform动态声明方式,有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72401055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com