我正在为一个新项目进行Terraform配置。该项目由多个微服务组成,我已经为其编写了模块。该项目应该托管在Digitalocean上,所以我安装了Terraform DigitaloceanProvider作为必需的提供商:
# ./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]
我试图通过module
中的providers
选项传递一个提供者,但这似乎没有什么区别:
module "spaces" {
source = "./Spaces"
providers = {
digitalocean = digitalocean
}
}
这可能是Terraform 0.14中的一个错误,还是我只是误解了?
谢谢。
在子模块中使用它时会失败,因为您只有顶级的required_providers
配置,您需要在每个模块中添加它。
这将在本线程中详细解释
需要在每个模块中声明提供程序源,因为提供者源代码工作有趣的副作用是,我们现在可以在配置中使用多个具有相同名称的提供程序。每个模块可以使用具有不同源的名为"dns"的提供程序。在内部,terraform使用源创建FQN(完全限定name(,因此您可以拥有例如三个模块,每个使用一个";mildwonkey/dns"hashicorp/dns";以及";yourname/dns";。