Terraform,如何集中提供者版本控制

Terraform, how to centralize providers versioning

我们使用 terraform 来创建 Azure PAAS 资源,它作为每个组件的单独管道步骤运行。例如-第一步数据组件规划和应用,第二步网络组件规划和应用等等。所以代码被安排到多个组件中,每个组件都有自己的提供者 azurerm 块定义。在块内,我们希望固定提供者版本,并希望以集中方式控制它。所以目前我们想出了以下方法。

provider "azurerm" {
  version                    = "=${ps.AzureRmVersion}"
  skip_provider_registration = "true"
  features {}
}

当发布过程运行时,有一个 powershell 功能用版本替换 ps.AzureRmVerison 标记。我的问题是是否有另一种方法可以控制提供程序版本而无需第三方(例如 powerhsell)来控制它。

provider 块中的 version 参数是旧版本 Terraform 的遗留模式,用于指定版本 constraints(此模块的一组版本兼容)而不是版本 selections(您要使用的单个 selected 版本)。

因为你想集中控制哪个版本是 selected 我认为最好的方法是让你的自动化脚本生成一个 Dependency Lock File包含您要开处方的版本。

通常情况下,Terraform 会在您安装和升级提供程序时自行管理此锁定文件,但在这种情况下,每个配置都会有自己的一组锁定,因此可能彼此不同。由于您想实施中央政策,因此您可以使用 Terraform CLI 和一个简单的配置, 包含 provider requirements declarations 您要使用的提供商:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "1.0.0"
    }
  }
}

在该目录中,您可以 运行 terraform providers lock 使 Terraform select 来自注册表的特定版本并生成一个 .terraform.lock.hcl 文件记录所有的校验和您指定的平台:

terraform providers lock -platform=windows_amd64 -platform=linux_amd64

然后您可以将该 .terraform.lock.hcl 文件保存到您的中央位置并配置您的自动化以在每次 运行 之前将该文件复制到工作目录(覆盖可能已经存在的任何文件)宁terraform init。然后,Terraform 将 select 锁定文件记录的任何包,并确保它与之前记录的校验和匹配。

您的个人 Terraform 配置可以选择包含它们自己的 非精确 版本约束,指定它们与哪些 Terraform 版本兼容,这将导致 Terraform 报告错误,如果集中-select您的共享锁文件中记录的版本与您的配置不兼容。


请注意,锁定文件仅限制已记录在其中的提供程序。如果您的配置之一需要锁定文件中不存在的其他提供程序,则默认情况下 terraform init 将 select 该提供程序的最新兼容版本并覆盖锁定文件以包含它。

如果您想阻止这种情况并要求将所有新提供程序添加到集中维护的锁定文件中,您可以向 terraform init 添加一个附加选项,以告知 Terraform 在其采取的操作将失败时失败需要更改锁定的提供程序:

terraform init -lockfile=readonly

要添加具有 使用模式的新提供程序,您需要 return 我之前描述的仅要求配置,将新提供程序添加到它,重新 运行 相同的 terraform providers lock 命令重新生成它,然后将您的“主”锁文件更新为该文件的新版本。