微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

}

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

provider "kubernetes" {
  alias                  = "kubernetes_blue"
}

provider "kubernetes" {
  alias                  = "kubernetes_green"
}

我想了解是否有办法,我可以对 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  
}

提前致谢。

解决方法

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
  }
}
module 块中的

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

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

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

,

从问题来看,您不清楚为什么需要两个提供程序定义。但是为了举例,我们可以考虑以下蓝/绿部署的常见用例:

  • 针对不同的集群
  • 针对不同的上下文

在这两种情况下,根据变量中设置的标志,使用具有不同提供程序配置的单个提供程序会更容易。

考虑像变量定义(使用 CREATE OR REPLACE FUNCTION public.getTableFromArray(idds integer[]) RETURNS table( id INTEGER,isChosen INTEGER ) LANGUAGE 'plpgsql' AS $BODY$ begin return query select id,case when ARRAY[table1.id] <@ idds then 1 else 0 end as isChosen FROM table1; end; $BODY$; 类型但也可以使用 string):

bool

假设我想定位不同的集群:

  • cluster1 用于蓝色
  • cluster2 绿色

然后可以根据变量的值配置提供程序(例如使用 variable "kubernetes_deployment" { type = string default = "blue" } )。为此,我们可以使用 ternary conditional

kubeconfig

这将确保资源(在本例中为命名空间)将在“cluster1”上创建用于蓝色部署,在“cluster2”中用于绿色部署。

此条件可应用于提供程序的其他配置参数。使用相同集群但不同上下文的示例:

provider "kubernetes" {
  config_path = var.kubernetes_deployment == "blue" ? "~/.kube/cluster1.config" : "~/.kube/cluster2.config"
}

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

  provider = kubernetes
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。