我有一个自定义地形提供程序,它有一个以列表为输入的资源。
以下是有问题的列表:https://github.com/volterraedge/terraform-provider-volterra/blob/main/volterra/resource_auto_volterra_http_loadbalancer.go#L3501
当我声明列表时,它需要设置为多个块,如下所示:
active_service_policies {
policies {
name = "foobar"
namespace = "shared"
}
policies {
name = "batz"
namespace = "shared"
}
}
相反,我希望能够像下面这样声明:
active_service_policies {
policies = [
{
name = "foobar"
namespace = "shared"
},
{
name = "batz"
namespace = "shared"
}
]
}
这会导致以下错误:
Error: Unsupported argument
on main.tf line 79, in resource "volterra_http_loadbalancer" "sp":
79: policies = [
An argument named "policies" is not expected here. Did you mean to define a block
of type "policies"?
为什么我不能使用有序列表?我如何允许使用它?
这个问题是因为policies
是Type: schema.TypeList,
吗?应该是TypeSet
还是其他对象?
您使用的Terraform SDK最初是为Terraform v0.11及更早版本设计的,因此它不支持那些旧的Terraform版本不支持的配置结构,Terraform v.11及更早版本也不支持您想要的对象列表。
要使用现代Terraform语言的全部功能,您可以使用更新的插件框架来构建您的提供商,该插件框架是围绕现代Terraform语言类型系统设计的,尽管由于年龄的差异,它目前也不如旧的SDK成熟。
在新的框架中,您可以声明一个tfsdk.Attribute
,它的Attributes
字段设置为tfsdk.ListNestedAttributes
结果:
tfsdk.Attribute{
Attributes: tfsdk.ListNestedAttributes(
map[string]tfsdk.Attribute{
"name": tfsdk.Attribute{
// ...
},
"namespace": tfsdk.Attribute{
// ...
},
},
tfsdk.ListNestedAttributesOptions{},
),
// ...
}
上面的(部分(示例声明了一个属性,该属性需要一个对象列表,其中每个对象本身都可以具有name
和namespace
属性。
在旧的SDK中,最接近这一点的是您在示例中显示的块序列。在使用该SDK构建的较旧的提供程序中,这里的常见模式是为块指定单数名称policy
,而不是复数名称policies
,这样在配置中可以更清楚地看到,每个块在序列中只声明一个策略。