具有Terraform的多个提供程序版本

具有Terraform的多个提供程序版本,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,有人知道是否有可能使用多个提供程序版本的Terraform脚本吗 例如,azurerm 2.0.0版创建一个资源,1.4.0版创建另一个资源? 我尝试指定提供者,如下所述: 但是,它似乎不起作用,因为它试图解析一个同时满足1.4.0和2.0.0的提供程序。 它包括以下错误: No provider "azurerm" plugins meet the constraint "=1.4.0,=2.0.0". 我这样问是因为我们有一个很大的Terraform代码库,如果可行的话,我想一点一点地迁移

有人知道是否有可能使用多个提供程序版本的Terraform脚本吗

例如,azurerm 2.0.0版创建一个资源,1.4.0版创建另一个资源? 我尝试指定提供者,如下所述:

但是,它似乎不起作用,因为它试图解析一个同时满足1.4.0和2.0.0的提供程序。 它包括以下错误:

No provider "azurerm" plugins meet the constraint "=1.4.0,=2.0.0".
我这样问是因为我们有一个很大的Terraform代码库,如果可行的话,我想一点一点地迁移

过去也有类似的问题,这里:
但是它没有得到有效的答案

不,你不能做你想做的事。Terraform希望您的约束匹配一个插件版本,如下所示:

如果安装了插件的多个版本,Terraform将使用 满足配置版本约束的最新版本

因此,无法解析您的约束以匹配任何插件,因此出现了错误

如何使用同一Terraform provider的多个版本 这使我们能够从helm2顺利过渡到helm3,同时使新部署能够立即使用helm3,从而减少技术债务的积累

当然,对于大多数提供商,您也可以这样做

我们是如何解决这个问题的 因此,我们的想法是下载我们的提供者的特定版本(在我的例子中是helm 0.10.6),并将其移动到terraform默认使用的文件系统镜像之一。关键部分是重新命名我们的插件二进制文件。在zip中,我们可以找到
terraform-provider-helm\u v0.10.6
,但我们将其重命名为
terraform-provider-helm2\u v0.10.6

PLUGIN\u PATH=/usr/share/terraform/plugins/registry.terraform.io/hashicorp/helm2/0.10.6/linux\u amd64
mkdir-p$PLUGIN\u路径
旋度-sLo_'https://releases.hashicorp.com/terraform-provider-helm/0.10.6/terraform-provider-helm_0.10.6_linux_amd64.zip'
解压-p'terraform provider helm*'>${PLUGIN_PATH}/terraform-provider-helm2_v0.10.6
rm_
chmod755${PLUGIN_PATH}/terraform-provider-helm2_v0.10.6
然后当我们声明两个提供者插件时 我们可以使用文件系统镜像中的
hashicorp/helm2
插件,让terraform直接下载最新的
hashicorp/helm
提供程序,它使用helm3

terraform {
  required_providers {
    helm2 = {
      source = "hashicorp/helm2"
    }
    helm = {
      source = "hashicorp/helm"
      version = ">= 2.0.0"
    }
  }
}
当初始化terraform时,您会发现

-查找hashicorp/helm的最新版本。。。
-正在查找hashicorp/helm2的最新版本。。。
-安装hashicorp/helm v2.0.2。。。
-已安装的hashicorp/helm v2.0.2(由hashicorp签署)
-安装hashicorp/helm2 v0.10.6。。。
-安装的hashicorp/helm2 v0.10.6(未经认证)
使用它
从这一点上讲,这相当简单。默认情况下,helm resources将在v2.0.2中选择更新的helm提供程序。您必须对旧资源明确使用
provider=helm2
helm_存储库
helm_发行版
)。迁移后,您可以删除它以使用默认的helm提供程序。

您可以逐个模块迁移,因为您的提供程序版本将/应该在根配置中指定。这将使这成为可能。唯一的问题是状态维护。这也是我所怀疑的,所以不幸的是,没有进行平滑升级的更改。谢谢如果您感兴趣,可以查看
# you will find the doc here https://registry.terraform.io/providers/hashicorp/helm/0.10.6/docs
provider "helm2" {
  install_tiller = false
  namespace      = "kube-system"

  kubernetes {
    ...
  }
}

# you will find the doc at latest version https://registry.terraform.io/providers/hashicorp/helm/latest/docs
provider "helm" {
  kubernetes {
    ...
  }
}