我们使用terraform来创建Azure PAAS资源,它作为每个组件的独立管道步骤运行。例如-第一步数据组件的规划和应用,第二步web组件的规划和应用等。因此,代码被排列成多个组件,每个组件都有自己的提供者azurerm块的定义。在块中,我们希望将提供程序版本固定在一起,并希望以集中的方式控制它。因此,目前我们提出了以下方法。
provider "azurerm" {
version = "=${ps.AzureRmVersion}"
skip_provider_registration = "true"
features {}
}当发布过程运行时,有一个powershell功能,它用版本替换ps.AzureRmVerison标记。我的问题是,是否有另一种方法来控制提供者版本,而不涉及第三方,比如powerhsell来控制它。
发布于 2021-11-03 01:27:47
version块中的provider参数是来自较早版本的Terraform的遗留模式,用于指定版本约束(此模块与之兼容的一组版本),而不是版本选择(要使用的单个选定版本)。
由于您希望集中控制所选择的确切版本,我认为最好的方法是让您的自动化脚本生成一个包含您想要指定的版本的依赖锁文件。
通常,Terraform在安装和升级提供程序时管理这个锁文件本身,但在这种情况下,每个配置都会有自己的一组锁,因此可能彼此不同。由于您希望强制实施中心策略,所以可以使用Terraform进行简单的配置,该配置只包含要使用的提供者的提供者需求声明:
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命令来重新生成它,然后将“主”锁文件更新到该文件的新版本。
https://stackoverflow.com/questions/69773104
复制相似问题