我对我在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 ={~>1.0}
我对此感到困惑,因为我从未在我的任何模块中指定过required_providers,尽管我使用的是提供程序,而且它说我必须这样做。直到今天我才知道文件上说了这句话。
那么,我是误解了文档,还是文档错了?我的每个模块是否需要required_providers?我的地形配置在没有它们的情况下绝对有效,所以它们是默认的吗?如果是,如何和地点?
发布于 2021-07-06 21:08:11
为了与早期版本的Terraform向后兼容,Terraformv0.13和以后将在required_providers中未声明的提供程序短名称的任何使用视为对hashicorp命名空间中提供程序的需求的隐式声明。
例如,我们可以考虑这样的资源:
resource "aws_instance" "example" {
# ...
}如果您还没有声明aws指的是什么提供者,那么Terraform就会假设您的意思是编写这样的东西:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
}这种行为主要是为了允许针对(以前唯一的自动安装提供程序)编写的现有模块继续工作,而不进行任何修改。如果您愿意,可以依赖于这种向后兼容性行为,但意图(反映在文档中)是,所有现代Terraform模块都应该明确说明它们使用的是哪些特定的提供者,这样,随着时间的推移,由于有更多的提供者属于其他名称空间,模块的读者不需要知道这个特殊的向后兼容性规则才能理解它的含义。
Terraformv0.13中包含的terraform 0.13upgrade命令将自动为模块使用的每个提供者生成一个合适的源地址,方法是引用一个表,该表将Terraformv0.12和更早版本所理解的提供程序名称映射到Terraformv0.13及更高版本所期望的完全限定的提供者源地址。只有由HashiCorp维护的地址(而不是由第三方维护,但以前由HashiCorp发布)位于hashicorp命名空间中,因此使用该工具将确保您将指定对应于Terraformv0.12为同一配置安装的提供程序的地址。
发布于 2021-07-02 00:59:14
子模块不需要required_providers,因为如果需要,它们将从父模块继承。来自文档
如果子模块不声明任何配置别名,则提供程序参数是可选的。如果省略它,则子模块从其父模块继承所有默认提供程序配置。(默认提供程序配置是不使用别名参数的配置。)
https://stackoverflow.com/questions/68216074
复制相似问题