我们如何在多个 terraform 提供者中创建相同的资源?

kri*_*nik 1 kubernetes terraform terraform-provider-kubernetes

我正在使用 terraform 创建 Kubernetes 命名空间。下面的示例

resource "kubernetes_namespace" "test1" {
  metadata {
    name = local.ns_name
  }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 terraform 按照此链接创建蓝/绿类型的部署。作为其中的一部分,我现在创建了两个 kubernetes 集群。一个是蓝色的,另一个是绿色的,现在我有两个 kubernetes 提供者

provider "kubernetes" {
  alias                  = "kubernetes_blue"
}

provider "kubernetes" {
  alias                  = "kubernetes_green"
}
Run Code Online (Sandbox Code Playgroud)

我想了解是否有一种方法,我可以有一些条件kubernetes_namespace,根据标志var.enable_green_sidevar.enable_blue_side,我可以在多个 kubernetes 集群中创建相同的命名空间,而不必重复整个资源块,如下所示

resource "kubernetes_namespace" "test1" {
  metadata {
    name = local.ns_name
  }

  provider = kubernetes.kubernetes_blue  
}

resource "kubernetes_namespace" "test2" {
  metadata {
    name = local.ns_name
  }

  provider = kubernetes.kubernetes_green  
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Mar*_*ins 6

Terraform 的模型要求每个resource块完全属于一个提供程序配置,因此无法避免两次声明资源,但您至少可以通过将其分解为一个模块并调用该模块两次来减少导致的重复量,而不是resource直接复制块:

provider "kubernetes" {
  alias = "blue"
}

provider "kubernetes" {
  alias = "green"
}

module "blue" {
  source = "../modules/bluegreen"

  # (any settings the module needs from the root)

  providers = {
    kubernetes = kubernetes.blue
  }
}

module "blue" {
  source = "../modules/bluegreen"

  # (any settings the module needs from the root)

  providers = {
    kubernetes = kubernetes.green
  }
}
Run Code Online (Sandbox Code Playgroud)

providers块中的特殊参数module允许您为子模块提供与调用者不同的声明的提供程序配置的“视图”。在module "blue"上面的块中,providers参数表示:“在此模块实例内,对默认kubernetes提供程序配置的任何引用都意味着使用kubernetes.blue调用者的配置”。

然后,您可以在模块内部编写普通resource "kubernetes_...."块,而无需任何特殊参数,因为这会导致它们从该模块实例的角度provider附加到默认提供程序,并且两个模块实例中的每一个都有与之绑定的不同配置。

这种分解到模块中是否会有帮助当然取决于子模块最终需要来自调用模块的上下文量。如果您的module块最终内部的参数几乎与resource您要分解的块一样多,那么最好将块保留resource在顶层并避免间接。