我想创建一个模块来定义此 cloudflare 资源的覆盖设置https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zone_settings_override
variable "settings" {
type = map(string)
default = {}
}
所以我考虑不定义每个可能的变量,而只是使用字符串映射将其放入我想要的设置块中。当然,我无法测试它是否是允许的变量,但我对此没意见。所以我想我云做了类似下面的伪代码的事情,但是缺少一些东西,我不知道是什么
resource "cloudflare_zone_settings_override" "this" {
zone_id = cloudflare_zone.this.id
for each = var.settings
settings {
each.key = each.value
}
}
该提供程序已定义
settings
为嵌套块,这意味着其架构是刚性的并且无法动态填充。因此,您需要显式分配您想要在模块中支持的每个嵌套参数。无法根据映射中的键动态分配,因为提供程序希望能够静态验证参数。
因为无论如何您都需要指定要支持的特定参数,所以将变量声明为具有可选属性的对象类型(而不是映射)会更容易(也更符合提供程序的设计):
将其声明为对象类型而不是映射的优点是,您可以假设所有声明的属性将始终存在于对象中,尽管可选属性可能是
null
. 然后您可以直接分配它们,因为null
在资源参数中始终相当于完全省略该参数。如果您正在编写共享模块(即:打算使用块从另一个模块调用的模块
module
),那么您可以考虑的另一种选择是将模块设计为仅导出cloudflare_zone.this.id
为输出值并让调用模块定义自己的resource "cloudflare_zone_settings_override"
块; 如果您只是将调用者的值逐字传递到此资源中,那么您还没有真正创建任何抽象,因此直接在调用者中定义资源将是等效的并且要简单得多。