如何在多个地形提供程序中创建相同的资源? [英] How can we create same resource in multiple terraform providers?

查看:0
本文介绍了如何在多个地形提供程序中创建相同的资源?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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
  }
}

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

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

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

这篇关于如何在多个地形提供程序中创建相同的资源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆