首页 > 解决方案 > 模块内部无法识别配置的提供程序

问题描述

我正在为一个新项目进行 Terraform 配置。该项目由多个微服务组成,我为其编写了模块。该项目应该托管在 Digitalocean 上,因此我安装了Terraform DigitalOcean Provider作为必需的提供程序:

# ./versions.tf
terraform {
  required_version = ">= 0.14"
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.3.0"
    }
  }
}

然后在以下位置“初始化” ./main.tf

provider "digitalocean" {
  token = var.do_token
}

但是,当我尝试运行terraform init时,由于错误而失败Error: Failed to query available provider packages.

terraform providers表明发生这种情况是因为模块试图要求提供者hashicorp/digitalocean而不是digitalocean/digitalocean

├── provider[registry.terraform.io/digitalocean/digitalocean] 2.3.0
├── provider[registry.terraform.io/hashicorp/kubernetes] 1.13.3
├── provider[registry.terraform.io/hashicorp/kubernetes-alpha] 0.2.1
└── module.spaces
    └── provider[registry.terraform.io/hashicorp/digitalocean]

我试图通过 中的providers选项传递提供者module,但这似乎没有什么不同:

module "spaces" {
  source     = "./Spaces"
  providers = {
    digitalocean = digitalocean
  }
}

这可能是 Terraform 0.14 中的错误,还是我只是误解?

谢谢。

标签: terraform

解决方案


在子模块中使用它会失败,因为您只有required_providers顶层的配置,您需要在每个模块中添加它。

这在这个线程中有详细解释

提供者源需要在每个模块中声明,因为提供者源工作的一个有趣的副作用是我们现在可以在配置中使用多个具有相同名称的提供者。每个模块都可以使用名为“dns”的提供程序,但来源不同。在内部,terraform 使用源为每个提供程序创建一个 FQN(完全限定名称),因此您可以拥有例如三个模块,每个模块使用“mildwonkey/dns”、“hashicorp/dns”和“yourname/dns”之一。


推荐阅读