升级Terraform至1.x弃用terraform-bundle,如何本地存同一Provider多版本?
解决Terraform 1.x本地存储同一Provider多版本的问题
由于terraform providers mirror默认只会拉取满足当前配置版本约束的单一版本,要在不使用terraform-bundle的前提下存储同一Provider的多个版本,可通过多次定向拉取并合并到同一本地目录的方式实现,以下是两种可行方案:
方案一:多次使用terraform providers mirror合并版本
这种方式直接利用镜像命令的输出特性,多次拉取不同版本到同一目录,新版本会被追加存储:
- 创建本地镜像目录
mkdir -p ./local-provider-mirror
- 创建临时配置文件指定第一个版本(比如
tf-aws-3.75.0.tf)
terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.75.0" } } }
- 执行镜像命令拉取该版本到本地目录
terraform providers mirror -config=tf-aws-3.75.0.tf ./local-provider-mirror
- 创建另一临时配置文件指定第二个版本(
tf-aws-3.75.2.tf)
terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.75.2" } } }
- 再次执行镜像命令,将新版本追加到同一目录
terraform providers mirror -config=tf-aws-3.75.2.tf ./local-provider-mirror
完成后,./local-provider-mirror目录下会同时存在两个版本的AWS Provider。
方案二:利用插件缓存目录收集多版本
通过指定插件缓存目录,多次初始化不同版本的临时配置,让Terraform自动将不同版本的Provider缓存到同一目录:
- 设置插件缓存目录(可自定义路径)
export TF_PLUGIN_CACHE_DIR=./local-plugin-cache
- 创建临时目录拉取第一个版本
mkdir temp-aws-3.75.0 && cd temp-aws-3.75.0 cat > main.tf << EOF terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.75.0" } } } EOF terraform init cd .. && rm -rf temp-aws-3.75.0
- 重复步骤2拉取第二个版本
mkdir temp-aws-3.75.2 && cd temp-aws-3.75.2 cat > main.tf << EOF terraform { required_providers { aws = { source = "hashicorp/aws" version = "3.75.2" } } } EOF terraform init cd .. && rm -rf temp-aws-3.75.2
此时./local-plugin-cache目录已存储两个版本的Provider,后续可将其作为本地镜像源使用。
配置主项目使用本地镜像
在主项目的Terraform配置中,添加provider_installation块指定本地镜像源,确保Terraform优先从本地查找对应版本:
terraform { provider_installation { filesystem_mirror { path = "./local-provider-mirror" # 或方案二中的./local-plugin-cache include = ["hashicorp/aws"] } direct { exclude = ["hashicorp/aws"] } } }
内容的提问来源于stack exchange,提问作者Michu
相关产品推荐
相关产品推荐

