首页 > 解决方案 > terrafrom 提供者传递给子模块不起作用

问题描述

我有一个模块调用另一个模块,我将 kubernetes 提供程序从主模块传递到第一个模块,然后将它传递给另一个模块。传递给第一个模块的提供者工作正常,但从第一个模块传递给其他模块的提供者不起作用

主文件

data "google_container_cluster" "gke" {
  depends_on = [module.gke]

  name     = var.gke_cluster_name
  project  = var.project_id
  location = var.gke_zone
}

provider "kubernetes" {
  alias                  = "my-kuber"
  host                   = "https://${data.google_container_cluster.gke.endpoint}"
  token                  = data.google_client_config.provider.access_token
  cluster_ca_certificate = base64decode(data.google_container_cluster.gke.master_auth[0].cluster_ca_certificate)
  load_config_file       = false
}

module "first-module" {
  source = "./modules/first-module"

  providers {
    kubernetes.my-kuber = kubernetes.my-kuber
  }
  .
  .
  .
}

第一个模块.tf

provider "kubernetes" {
  alias = "my-kuber"
}

module "sub-module" {
  source = "./modules/second-module"

  providers {
    kubernetes.my-kuber = kubernetes.my-kuber
  }
  .
  .
  .
}

第二个模块.tf

provider "kubernetes" {
  alias = "my-kuber"
}

resource "kubernetes_namespace" "ns" {
  provider = kubernetes.my-kuber

  metadata {
    name = var.namespace
  }
}

此处传递给的 kubernetes.my-kubersecond_module.tf没有正确的集群凭据,因此失败

我错过了什么吗?是否支持将提供程序向下传递到子模块?

提前致谢

标签: kubernetesterraformgoogle-kubernetes-engine

解决方案


您不需要将您的提供者“传递”给您的模块。仅当您有多个 kubernetes 提供程序时才需要模块中的providers属性,这似乎不是您的情况。仅在您正在执行的根模块中定义提供程序terraform plan,您不需要子模块中的提供程序块。Terraform 能够根据资源类型定义使用哪个提供者:kubernetes_namespace意味着提供者是 kubernetes。

像这样的东西应该可以正常工作:

主文件

data "google_container_cluster" "gke" {
  depends_on = [module.gke]

  name     = var.gke_cluster_name
  project  = var.project_id
  location = var.gke_zone
}

provider "kubernetes" {
  host                   = "https://${data.google_container_cluster.gke.endpoint}"
  token                  = data.google_client_config.provider.access_token
  cluster_ca_certificate = base64decode(data.google_container_cluster.gke.master_auth[0].cluster_ca_certificate)
  load_config_file       = false
}

module "first-module" {
  source = "./modules/first-module"

  .
  .
  .
}

第一个模块.tf

module "sub-module" {
  source = "./modules/second-module"

  .
  .
  .
}

第二个模块.tf

resource "kubernetes_namespace" "ns" {
  metadata {
    name = var.namespace
  }
}

推荐阅读