首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个地形提供者中创建相同的资源?

如何在多个地形提供者中创建相同的资源?
EN

Stack Overflow用户
提问于 2021-04-11 08:11:34
回答 2查看 1.2K关注 0票数 1

我使用terraform创建Kubernetes命名空间。以下样品

代码语言:javascript
复制
resource "kubernetes_namespace" "test1" {
  metadata {
    name = local.ns_name
  }

}

我正在尝试使用terraform创建蓝色/绿色的部署,遵循这个链接。作为其中的一部分,我现在创建了两个kubernetes集群。一个是蓝色的,另一个是绿色的,现在我有两个库伯内特斯供应商。

代码语言:javascript
复制
provider "kubernetes" {
  alias                  = "kubernetes_blue"
}

provider "kubernetes" {
  alias                  = "kubernetes_green"
}

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

代码语言:javascript
复制
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  
}

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-12 18:44:22

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

代码语言:javascript
复制
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允许您为子模块提供与调用方不同的声明提供程序配置的“视图”。在上面的module "blue"块中,providers参数是:“在这个模块实例中,对默认kubernetes提供程序配置的任何引用都意味着使用调用方的kubernetes.blue配置”。

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

当然,这个分解到模块中是否有帮助,将取决于子模块最终需要多少来自调用模块的上下文。如果您的module块中的参数与正在分解的resource块中的参数几乎相同,那么最好将resource块保持在顶层,并避免间接性。

票数 3
EN

Stack Overflow用户

发布于 2021-04-11 16:42:23

从问题上看,还不清楚为什么需要两个提供程序定义。但是为了示例起见,我们可以考虑以下用于蓝色/绿色部署的通用用例:

  • 目标不同簇
  • 针对不同的上下文

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

考虑这样的变量定义(使用string类型,但也可以使用bool ):

代码语言:javascript
复制
variable "kubernetes_deployment" {
  type    = string
  default = "blue"
}

假设我想针对不同的集群:

  • 蓝色cluster1
  • 绿色cluster2

然后可以根据变量的值配置提供程序(例如使用kubeconfig )。为此,我们可以使用三元条件

代码语言:javascript
复制
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
}

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

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

代码语言:javascript
复制
provider "kubernetes" {
  config_path = "~/.kube/cluster1.config"
  config_context = var.kubernetes_deployment == "blue" ? "context1" : "context2"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67042763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档