【问题标题】:Attributes as Blocks with dynamic key and value in TerraformTerraform 中具有动态键和值的块的属性
【发布时间】:2021-09-06 18:35:37
【问题描述】:

我想为 Cloudflare 创建 Terraform 模块,但我坚持使用 cloudflare_zone_settings_override 设置块。我无法根据包含地图的输入变量动态创建它。

目标是有输入变量 settings_override 里面有可变数量的设置。示例:

  settings_override = {
    always_use_https = "on"
    ssl              = "flexible"
  }

我想要实现的是这样的,我可以在输入上进行可变数量的设置(它是模块,因此每个环境可以是可变的)。

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id
  for_each  = var.settings_override

  settings {
    always_use_https = "on"
    ssl              = "flexible"
  }
}

但是我总是收到同样的错误:

Error: Argument or block definition required

  on main.tf line 72, in resource "cloudflare_zone_settings_override" "this":
  72:     each.key = each.value

An argument or block definition is required here. To set an argument, use
the equals sign "=" to introduce the argument value.

不工作的代码。我也尝试过使用dynamic,但是 settings 块只能是一个,所以我认为这不是正确的方法......

variable "settings_override" {
  description = "Override Cloudflare configuration"
  type        = map(string)
  default     = {}
}

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id
  for_each  = var.settings_override

  settings {
    each.key = each.value
  }
}

这甚至可以使用 Terraform 实现吗?或者我必须指定所有可能的选项并使用 for_each 替换它们?

Terraform 版本 v1.0.6
Cloudflare 提供商版本:2.10.1

【问题讨论】:

  • "这里需要块定义" - 完整的信息是什么?这个“这里”在哪里?也不清楚你想要实现什么。您想要一些从父模块覆盖的默认值?
  • 嗨@Marcin,感谢您的评论。我在帖子中包含了完整的错误,所以现在应该更清楚了。我想实现,因为它是覆盖,将设置块传递到模块中。一旦它有两个选项,另一个时间有十个。没有默认值(默认值由 Cloudflare 设置),只有需要覆盖的值。

标签: terraform cloudflare


【解决方案1】:

您必须明确提供所有选项。例如:

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id

  settings {
    always_use_https = lookup(var.settings_override, "always_use_https", null)
    ssl = lookup(var.settings_override, "ssl", null)
    mirage = lookup(var.settings_override, "mirage", null)
    # ... and so on
  }
}

【讨论】:

  • 谢谢。这是我想避免的,但似乎没有其他选择。
  • 顺便说一句。这个解决方案是否等同于查找 - always_online = try(var.settings_override["always_online"], null)
  • 它帮助解决了这个问题,但是由于 Cloudflare 提供商的一些问题,我不得不注释掉所有未使用的属性——从状态中删除这个资源并只保留需要的东西。不知道为什么,但我得到“无法更改只读值”。
猜你喜欢
  • 1970-01-01
  • 2022-01-27
  • 2021-02-24
  • 2020-05-30
  • 2022-01-20
  • 2014-02-18
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多