Terraform:声明结构化/类型化的局部或变量
我正在实施Cloudflare 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
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
}
}