地形;为什么通过列表索引语法引用元数据?

Tom*_*mmy 3 terraform

示例: https: //www.terraform.io/docs/providers/kubernetes/r/service_account.html

我们看到这个:

resource "kubernetes_service_account" "example" {
  metadata {
    name = "terraform-example"
  }
  secret {
    name = "${kubernetes_secret.example.metadata.0.name}"
  }
}
Run Code Online (Sandbox Code Playgroud)

元数据不是列表,为什么秘密/名称值使用引用元数据.0

Mar*_*ins 6

提供者已将metadata块类型定义为在内部表示为对象列表。这在当今的 Terraform 提供程序中很常见,因为 Terraform v0.12 之前的 Terraform 版本要求提供程序仅在列表和集合之间进行选择,作为嵌套块类型的支持数据类型。

Terraform v0.12 及更高版本确实支持将单例块表示为单个对象,但早于 Terraform v0.12 版本的提供程序往往仍使用列表表示形式以实现向后兼容性。(在撰写本文时,大多数提供商在其新版本中仍然兼容 Terraform v0.11 和 v0.12。)

kubernetes提供程序(在我撰写本文时仍在开发中)是专门为 Terraform v0.12 及更高版本构建的,因此它能够更直接地反映底层 Kubernetes 模式,包括将其视为metadata单个对象。有关新提供商版本的公告帖子包含以下示例:

resource "kubernetes_manifest" "example_crd" {
  provider = kubernetes-alpha

  manifest = {
    apiVersion = "apiextensions.k8s.io/v1"
    kind = "CustomResourceDefinition"
    metadata = {
      name = "testcrds.hashicorp.com"
      labels = {
        app = "test"
      }
    }
    spec = {
      group = "hashicorp.com"
      names = {
        kind = "TestCrd"
        plural = "testcrds"
      }
      scope = "Namespaced"
      versions = [
        {
          name = "v1"
          served = true
          storage = true
          schema = {
            openAPIV3Schema = {
              type = "object"
              properties = {
                data = {
                  type = "string"
                }
                refs = {
                  type = "number"
                }
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

可以通过更直观的方式访问这个新提供程序的元数据名称,因为它metadata是单个对象:

kubernetes_manifest.example_crd.manifest.metadata.name
Run Code Online (Sandbox Code Playgroud)