Terraform 0.13带来了一系列的重大变革
Terraform 0.13 的变更是破坏性的变动。
为了那些想要升级到Terraform 0.13但担心可能存在的破坏性变更的人,我将介绍一些我在试用并遇到的破坏性变更引起的问题。
要点注意
并不仅限于从0.12升级到0.13的情况,如果在更新Terraform之后执行写入状态文件的命令,
除非从备份中还原状态文件,否则将无法再次在以前的Terraform版本上运行。
如果团队使用Terraform,请确保每个人都升级到相同的版本。
第三方的Terraform供应商
總的來說,如果沒有使用第三方的Terraform提供者,我認為很多人能順利升級到0.13版本。
還有一些破壞性的變更,但在我這裡只有這個問題引起了問題。
为了允许第三方未与Hashicorp签订合作协议的开发者发布插件,Terraform 0.13在提供者名称中添加了命名空间。这样一来,只要不是hashicorp命名空间,在其他命名空间中也可以上传自行创建的插件。同时,我们还可以从hashicorp官方注册表(registry.terraform.io)以外的地方下载并安装插件。
如果在注册表中公开了,迁移方法如下。
如果插件在官方注册表中可用,您只需稍作修改就可以迁移。
必须指定命名空间。
之前
terraform {
required_providers {
ct = "0.6.1"
}
}
发生了一系列暴力事件,我们迫切需要采取措施来终止这种不安定的局势。
terraform {
required_providers {
ct = {
source = "poseidon/ct"
version = "0.6.1"
}
}
}
如果从根模块调用模块,并且使用相同的第三方供应商,以前可以在 required_providers 块中不指定 source 并使用。但是从0.13版本开始,子模块也需要指定相同的内容。如果不指定,只会尝试从 hashicorp/ct 安装子模块,导致 terraform init 失败。
Initializing modules...
Initializing the backend...
Initializing provider plugins...
- Using previously-installed hashicorp/null v2.1.2
- Using previously-installed -/template v2.1.2
- Using previously-installed -/aws v3.9.0
- Using previously-installed -/local v1.4.0
- Using previously-installed hashicorp/template v2.1.2
- Using previously-installed hashicorp/random v2.3.0
- Using previously-installed -/null v2.1.2
- Using previously-installed -/random v2.3.0
- Using previously-installed -/tls v2.2.0
- Using previously-installed hashicorp/local v1.4.0
- Using previously-installed hashicorp/tls v2.2.0
- Using previously-installed hashicorp/aws v3.9.0
- Using previously-installed poseidon/ct v0.6.1
- Finding latest version of hashicorp/ct...
Error: Failed to install provider
Error while installing hashicorp/ct: provider registry registry.terraform.io
does not have a provider named registry.terraform.io/hashicorp/ct
在0.12之前安装的提供程序将被临时视为特殊名称空间的提供程序处理。
在0.13中,属于hashicorp名称空间的提供程序将自动迁移到具有命名空间的对象,但第三方提供程序将不会自动迁移,而是会报错。
Error: Failed to install legacy providers required by state
Found unresolvable legacy provider references in state. It looks like these
refer to in-house providers. You can update the resources in state with the
following command:
terraform state replace-provider registry.terraform.io/-/ct registry.terraform.io/poseidon/ct
请按照显示的指示执行命令,并手动迁移状态文件。
terraform state replace-provider registry.terraform.io/-/ct registry.terraform.io/poseidon/ct
Terraform will perform the following actions:
~ Updating provider:
- registry.terraform.io/-/ct
+ registry.terraform.io/poseidon/ct
Changing 3 resources:
data.ct_config.controller-ignitions
module.etcds.data.ct_config.worker-ignitions
module.workers.data.ct_config.worker-ignitions
Do you want to make these changes?
Only 'yes' will be accepted to continue.
Enter a value: yes
Successfully replaced provider for 3 resources.
如果在注册表中没有公开发布呢?
即使在0.13版本中,您仍然可以手动将插件放置在目录中进行使用,但是插件的位置已经改变。
您需要使用类似于注册表中公开插件的格式进行指定,即 域名/命名空间/名称。无法使用 registry.terraform.io。
terraform {
required_providers {
secret = {
source = "tweag.io/tweag/secret"
version = "1.1.2"
}
}
}
Linux, AMD64架构下插件执行文件的存放位置
~/.terraform.d/plugins/tweag.io/tweag/secret/1.1.2/linux_amd64/terraform-provider-secret_v1.1.2
手动安装的插件由于未进行签名验证,因此在安装日志中将显示未经验证。
- Finding tweag.io/tweag/secret versions matching "1.1.2"...
- Installing tweag.io/tweag/secret v1.1.2...
- Installed tweag.io/tweag/secret v1.1.2 (unauthenticated)