传递给子模块的 terraform 提供程序不起作用

Posted

技术标签:

【中文标题】传递给子模块的 terraform 提供程序不起作用【英文标题】:terrafrom providers passed down to submodule doesn't work 【发布时间】:2021-03-29 10:02:03 【问题描述】:

我有一个模块调用另一个模块,我将 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" 
  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
  
  .
  .
  .

第二个模块.tf

provider "kubernetes" 
  alias = "my-kuber"


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

  metadata 
    name = var.namespace
  

这里传递给second_module.tf 的 kubernetes.my-kuber 没有正确的集群凭据并且它失败了

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

提前致谢

【问题讨论】:

【参考方案1】:

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

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

ma​​in.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
  

【讨论】:

谢谢我按照你的建议清理了代码,看起来 kubernetes 提供程序仍在尝试加载默认值,而不是使用我设置的那个。我看到以下错误 Get "localhost/api/v1/namespaces/rabbitmq": dial tcp [::1]:80: connect: connection denied 错误: Get "localhost/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/…": dial tcp [::1]:80: connect: connection denied跨度>

以上是关于传递给子模块的 terraform 提供程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 模块依赖项不起作用(版本 0.12)

将 NSManagedObject 传递给子上下文不起作用

将状态作为道具传递给子组件不起作用

如何解决:上下文提供程序未将新的上下文值传递给子级

如何将使用 cidrsubnets 的子网的 CIDR 范围传递给 Terraform 版本 0.14 中的 VPC 模块

Terraform 模块作为“自定义函数”