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 块中声明。
提供程序要求由本地名称、源位置和版本约束组成:
Run Code Online (Sandbox Code Playgroud)terraform { required_providers { mycloud = { source = "mycorp/mycloud" version = "~> 1.0" } } }
我对此感到困惑,因为我从未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 将安装相同的配置。
归档时间: |
|
查看次数: |
26002 次 |
最近记录: |