如何在多个地形提供程序中创建相同的资源? [英] How can we create same resource in multiple terraform providers?
问题描述
我正在使用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_side
和var.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屋!