Terraform:声明结构化/类型化的局部或变量

Terraform:声明结构化/类型化的局部或变量,terraform,terraform-template-file,terraform-provider-cloudflare,Terraform,Terraform Template File,Terraform Provider Cloudflare,我正在实施Cloudflare Terraform脚本,在为区域设置消除块重复数据时遇到问题: resource "cloudflare_zone_settings_override" "my-domain-settings-1" { zone_id = cloudflare_zone.my_domain1.id settings { # very_long_list_of_settings } } resource "cl

我正在实施Cloudflare Terraform脚本,在为区域设置消除块重复数据时遇到问题:

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  zone_id = cloudflare_zone.my_domain1.id
  settings {
    # very_long_list_of_settings
  }
}

resource "cloudflare_zone_settings_override" "my-domain-settings-2" {
  zone_id = cloudflare_zone.my_domain2.id
  settings {
    # very_long_list_of_settings
  }
}
设置块有约60行,完全相等。我试图通过foreach实现这一点:

variable domains {
  default = [
    # ERROR: Variables may not be used here.
    cloudflare_zone.my_domain1,
    cloudflare_zone.my_domain2,
  ]
}

resource "cloudflare_zone_settings_override" "partners-zone-settings" {
  name = var.domains[count.index].name
  zone_id = var.domains[count.index].id
  settings {
    # very_long_list_of_settings
  }
}
(完整代码:)

但是这是失败的,
变量不能在这里使用。
在变量块中

所以我试着和当地人交流:

locals {
  zone_settings {
    # very_long_list_of_settings
    # ERROR: cannot have nested blocks
  }
}

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  zone_id = cloudflare_zone.divadlouhasicu_cz.id
  # ERROR: An argument named "settings" is not expected here. Did you mean to define a block of type "settings"?
  settings = var.zone_settings
}

resource "cloudflare_zone_settings_override" "my-domain-settings-2" {
  zone_id = cloudflare_zone.divadlouhasicu_net.id
  # ERROR: An argument named "settings" is not expected here. Did you mean to define a block of type "settings"?
  settings = var.zone_settings
}
(完整代码:)

但这以上面两条评论中的错误而告终

有什么方法可以做到这一点吗?

čau Vojto

如果您是Terraform 12或更高,您可以对每个构造使用
。在较低版本中没有办法

代码看起来像这样(我没有测试它,所以几乎可以肯定需要进行一些修改):


我认为没有办法:(čau Ondřeji,不幸的是,这不起作用,因为变量
不能包含其他变量-与我上面描述的问题相同:
错误:这里可能不使用变量
如果您将
变量域
块更改为局部块,这个答案应该会让您走上正确的方向(这就是定义非输入变量的方式),类似这样:
locals{domains=[cloudflare\u zone.my\u domain1,cloudflare\u zone.my\u domain2]}
并用
for\u each=local.domains
引用它。我只是在测试它,对我来说它不起作用:
给定的“for\u each”参数值是不合适的:“for_each”参数必须是一个映射或一组字符串,并且您提供了一个类型为tuple的值。
要克服上述错误
toset()
函数应该这样使用:
toset([cloudflare\u zone.my\u domain1.id,cloudflare\u zone.my\u domain2.id])
local
中或直接在
for_each
中,但无论出于何种原因,它对我也不起作用:
给定的“for_each”参数值不合适:“for_each”“支持映射和字符串集,但您提供了一个包含dynamic类型的集。
我尝试使用
tostring()
显式转换每个导出值,但运气不佳。这可能会帮助您朝正确的方向前进:)
variable domains {
  default = [
    # ERROR: Variables may not be used here.
    cloudflare_zone.my_domain1,
    cloudflare_zone.my_domain2,
  ]
}

resource "cloudflare_zone_settings_override" "my-domain-settings-1" {
  for_each = var.domains

  zone_id = each.value
  settings {
    # very_long_list_of_settings
  }
}