1

我有一个自定义 terraform 提供程序,其资源将列表作为其输入之一。

这是有问题的列表: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还是其他一些对象?

4

1 回答 1

1

您使用的 Terraform SDK 最初是为 Terraform v0.11 和更早版本设计的,因此它不支持那些旧版本不支持的配置结构,并且 Terraform v0.11 和更早版本不支持对象列表你打算在这里的方式。

要使用现代 Terraform 语言的全部功能,您可以使用较新的 Plugin Framework构建您的提供程序,它是围绕现代 Terraform 语言类型系统设计的,尽管由于它们的年龄差异,它目前还不如旧 SDK 成熟.

在新框架中,您可以声明一个tfsdk.AttributeAttributes字段设置为tfsdk.ListNestedAttributes结果的 a:

tfsdk.Attribute{
    Attributes: tfsdk.ListNestedAttributes(
        map[string]tfsdk.Attribute{
            "name": tfsdk.Attribute{
                // ...
            },
            "namespace": tfsdk.Attribute{
                // ...
            },
        },
        tfsdk.ListNestedAttributesOptions{},
    ),

    // ...
}

上面的(部分)示例声明了一个属性,该属性需要一个对象列表,其中每个对象都可以拥有namenamespace属性本身。

在较旧的 SDK 中,您最接近这一点的是您在示例中显示的块序列。在使用该 SDK 构建的旧提供程序中,这里的常见模式是为块指定单数名称policy,而不是复数名称policies,以便在配置中更清楚地说明每个块在序列中仅声明一个策略。

于 2021-11-18T16:51:24.177 回答