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)
广告
将在 10 秒后关闭
bannerAds