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



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

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

当发布过程运行时,有一个powershell功能将ps. azurermversion标记替换为版本。我的问题是,是否有另一种方法来控制提供商版本,而不涉及第三方,如powerhsell来控制它。

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

既然你想集中控制选择的确切版本,我认为最好的方法是让你的自动化脚本生成一个包含你想要指定的版本的依赖锁文件。

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

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

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

terraform providers lock -platform=windows_amd64 -platform=linux_amd64

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

您的个人Terraform配置可能选择性地包含他们自己的非精确版本约束,指定他们与哪些Terraform版本兼容,这将导致Terraform报告一个错误,如果记录在您的共享锁文件中的中央选择的版本与您的配置之一不兼容。


注意,锁文件只约束已经记录在其中的提供程序。如果你的一个配置需要一个不同的提供程序,而这个提供程序不在锁文件中,那么默认情况下,terraform init将选择该提供程序的最新兼容版本,并覆盖锁文件以包含它。

如果你想防止这种情况,并要求所有新的提供者都被添加到集中维护的锁文件中,你可以在terraform init中添加一个额外的选项,告诉Terraform,如果它所采取的行动需要更改锁定的提供者,则失败:

terraform init -lockfile=readonly

要使用这个使用模式添加一个新的提供程序,您需要返回到我前面描述的仅满足需求的配置,向其中添加新的提供程序,重新运行相同的terraform providers lock命令来重新生成它,然后更新您的"母版";将文件锁定到新版本的文件

相关内容

  • 没有找到相关文章

最新更新