terraform 模块需要 required_providers 吗?

Dan*_*lan 26 terraform terraform0.12+

我对在 terraform 文档中读到的内容有点困惑。以下是关于模块的说明:

https://www.terraform.io/docs/language/modules/index.html

模块是一起使用的多种资源的容器。模块由保存在一个目录中的 .tf 和/或 .tf.json 文件的集合组成。

以下是关于提供商的说明: https ://www.terraform.io/docs/language/providers/requirements.html

要求提供者

每个 Terraform 模块必须声明它需要哪些提供程序,以便 Terraform 可以安装和使用它们。提供者要求在 required_providers 块中声明。

提供程序要求由本地名称、源位置和版本约束组成:

terraform {
 required_providers {
    mycloud = {
      source  = "mycorp/mycloud"
      version = "~> 1.0"
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

我对此感到困惑,因为我从未required_providers在任何模块中指定过,即使我正在使用提供程序并且它说我必须这样做。直到今天我什至不知道文档这么说。

那么我是否误解了文档,或者文档是错误的?我的每个模块required_providers是否需要?我的 terraform 配置在没有它们的情况下肯定可以工作,那么它们是否默认为某些内容?如果是,如何以及在哪里?

Mar*_*ins 27

为了向后兼容早期版本的 Terraform,Terraform v0.13 及更高版本将任何未声明的提供程序短名称的使用视为命名空间required_providers中提供程序要求的隐式声明hashicorp

例如,我们可以考虑这样的资源:

resource "aws_instance" "example" {
  # ...
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有声明您所指的提供者,aws那么 Terraform 会假设您打算编写如下内容:

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此行为主要是为了允许针对 HashiCorp 分布式提供程序(以前是唯一的可自动安装提供程序)编写的现有模块无需任何修改即可继续工作。如果您愿意,您可以依赖这种向后兼容性行为,但意图(在文档中反映)是所有现代 Terraform 模块都应该明确它们正在使用哪些特定提供程序,以便随着时间的推移,有更多的提供程序属于对于其他命名空间,模块的读者不需要了解这种特殊的向后兼容性规则即可理解其含义。

Terraform v0.13 中包含的命令terraform 0.13upgrade将通过引用将 Terraform v0.12 及更早版本所理解的提供程序名称映射到预期的完全限定提供程序源地址的表,自动为模块正在使用的每个提供程序生成合适的源地址由 Terraform v0.13 及更高版本提供。只有由 HashiCorp维护的那些(而不是由第三方维护但之前由 HashiCorp分发的)才位于hashicorp命名空间中,因此使用该工具将确保您指定与 Terraform 提供的提供程序相对应的地址v0.12 将安装相同的配置。


Mar*_*cin 5

子模块不需要required_providers,因为如果需要它们将从父模块继承。来自文档

如果子模块没有声明任何配置别名,则providers参数是可选的。如果省略它,子模块将从其父模块继承所有默认提供程序配置。(默认提供程序配置是不使用别名参数的配置。)

  • @DanielKaplan 我同意文档令人困惑。也许他们应该写每个父模块都需要一个提供者,而不是所有模块。 (2认同)