terraform - 模块内部无法识别配置的提供程序
问题描述
我正在为一个新项目进行 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 中的错误,还是我只是误解?
谢谢。
解决方案
在子模块中使用它会失败,因为您只有required_providers
顶层的配置,您需要在每个模块中添加它。
提供者源需要在每个模块中声明,因为提供者源工作的一个有趣的副作用是我们现在可以在配置中使用多个具有相同名称的提供者。每个模块都可以使用名为“dns”的提供程序,但来源不同。在内部,terraform 使用源为每个提供程序创建一个 FQN(完全限定名称),因此您可以拥有例如三个模块,每个模块使用“mildwonkey/dns”、“hashicorp/dns”和“yourname/dns”之一。
推荐阅读
- php - 当有新访客时 PDO 如何插入?PHP & PDO
- operating-system - GDT 使用的理论例子是什么?
- ios - 创建开发证书 iOS
- praat - Praat 中的变调准确吗?
- javascript - 如何实时更新而不是一次又一次地重新加载浏览器?
- react-native - 只有在有条件的情况下,如何才能设置状态?
- jupyter-notebook - 将标记单元更改为代码单元的键盘快捷键是什么?
- bash - 带有变量的 printf 没有按预期工作
- dart - 如何在颤动中更改日期和时间格式?
- sql - SQL:PostgresSQL,按两列分组和平均 - 即使平均值为零,如何显示所有组