【问题标题】:Terraform: Declaring a structured/typed local or variableTerraform:声明结构化/类型化的本地或变量
【发布时间】:2020-10-14 12:51:19
【问题描述】:

我正在实现一个 Cloudflare Terraform 脚本,但在为 zone_settings 删除重复数据块时遇到问题:

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
  }
}

(完整代码:https://gist.github.com/knyttl/ee10aa7d63adda866fe39151a9e015d9

但这在变量块中使用Variables may not be used here. 失败。

所以我尝试了当地人:

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
}

(完整代码:https://gist.github.com/knyttl/76ff39f3baf68df19dfbd05a37eb0ea5

但这以上面两个 cmets 中的错误结束。

有没有办法做到这一点?

【问题讨论】:

  • 我认为没有办法:(

标签: terraform terraform-template-file terraform-provider-cloudflare


【解决方案1】:

考沃伊托,

如果您是 Terraform 12 或更高版本,您可以使用 for_each 构造。低版本是没有办法的。

https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each

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

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
  }
}

【讨论】:

  • čau Ondřeji,不幸的是,这不起作用,因为变量 domains 不能包含其他变量 - 与我上面描述的相同问题:ERROR: Variables may not be used here
  • 如果您将 variable domains 块更改为本地块(这是您定义非输入变量的方式),这个答案应该会让您朝着正确的方向前进,如下所示:locals { domains = [cloudflare_zone.my_domain1, cloudflare_zone.my_domain2] } 和参考它与for_each = local.domains.
  • 我只是在测试它,对我来说它不能这样工作:The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type tuple.
  • 为了克服上述错误 toset() 函数应该这样使用:toset([cloudflare_zone.my_domain1.id, cloudflare_zone.my_domain2.id]) 要么在 local 内,要么直接在 for_each 内,但无论出于何种原因,它都不适合我:@ 987654335@ 我尝试使用tostring() 显式转换每个导出值,但没有任何运气。也许这会帮助你走向正确的方向:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2021-01-15
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多