поставщики terrafrom, переданные в подмодуль, не работают

#kubernetes #terraform #google-kubernetes-engine

# #kubernetes #terraform #google-kubernetes-engine

Вопрос:

У меня есть модуль, вызывающий другой модуль, я передаю kubernetes provider из main в 1-й модуль, который затем передает его в другой модуль. поставщик, переданный в 1-й модуль, работает нормально, но поставщик, переданный из 1-го модуля в другой, не работает

main.tf

 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
  }
  .
  .
  .
}
 

first-module.tf

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

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

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

second-module.tf

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

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

  metadata {
    name = var.namespace
  }
}
 

Здесь kubernetes.my-kuber, переданный в second_module.tf , не имеет правильных учетных данных кластера, и он терпит неудачу

Я что-то упускаю из виду? поддерживается ли передача провайдера к вспомогательным модулям?

Заранее спасибо

Ответ №1:

Вам не нужно «передавать» своего провайдера своему модулю. providers Атрибут в вашем модуле необходим только в том случае, если у вас несколько поставщиков kubernetes, что, похоже, не ваш случай. Определите поставщика только в корневом модуле, на котором вы выполняете terraform plan , вам не нужен блок поставщика в ваших подмодулях. Terraform может определять, какого поставщика использовать, исходя из типа ресурса: kubernetes_namespace это означает, что поставщиком является kubernetes.

Что-то вроде этого должно работать нормально :

main.tf

 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"

  .
  .
  .
}
 

first-module.tf

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

  .
  .
  .
}
 

second-module.tf

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

Комментарии:

1. Спасибо, я очистил код, как вы предложили, и похоже, что поставщик kubernetes все еще пытается загрузить default вместо того, чтобы использовать тот, который я настроил. Я вижу ниже ошибку Get » localhost / api / v1 / namespaces/rabbitmq «: набрать tcp [::1]:80: connect: ошибка отказа в подключении: Получить » localhost / apis/rbac.authorization.k8s.io/v1 / clusterrolebindings/… «: набрать tcp [::1]:80: connect: отказано в подключении