tertransform遍历对象列表



我有对象变量的映射,我正在迭代,这是预期的工作,但我认为我可以做得更好。我现在有的是:

variable "channel_list" {
type        = map(object({
channel   = string
}))
default = {
"1" = {
channel = "#channel1"
}
}
resource "grafana_contact_point" "contact_point" {
for_each         = var.channel_list
name             = trim(each.value["channel"], "#")
slack {
...
recipient = each.value["channel"]
username  = "xy"
}
}
resource "grafana_notification_policy" "slack_notification_policy" {
group_by      = ["..."]
contact_point = grafana_contact_point.contact_point_unmatched.name
policy {
matcher {
label = "x"
match = "=~"
value = ".*"
}
contact_point   = var.env == "production" ? "prod" : "non-prod"
group_by        = ["..."]
}

正如我所说,它工作得很好,但我有两个环境之间的模块分裂,我想从grafana_notification_policy资源中的contact_point中删除静态值。因此,我将变量修改为对象列表:

variable "channel_list" {
type        = list(object({
one-name       = string
another-name   = string
}))
default = [
{
"one-name"     = "#channel1",
"another-name" = "#channel2",
}

以及将grafana_notification_policy中的策略块变为dynamic:

dynamic "policy" {
for_each = var.channel_list
content {
matcher {
label = "x"
match = "=~"
value = ".*"
}
contact_point = lookup(policy.value, "one-name", var.channel_list)
}
}

我不确定的是如何使grafana_contact_point资源与此一起工作。

有一种更简单的方法可以实现你想要的。您使用的变量可以定义为:

variable "channel_list" {
type = map(string)
default = {
"one-name"     = "#channel1",
"another-name" = "#channel2",
}
}

然后,资源可以毫无问题地使用for_each:

resource "grafana_contact_point" "contact_point" {
for_each         = var.channel_list
name             = trim(each.value, "#")
slack {
...
recipient = each.value
username  = "xy"
}
}

最新更新