Terraform的多个提供程序版本

时间:2020-05-13 12:19:49

标签: terraform terraform-provider-azure

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

例如azurerm版本2.0.0创建一个资源,而1.4.0创建另一个资源? 我尝试指定提供者,如此处记录:https://www.terraform.io/docs/configuration/providers.html

但是,它似乎无法正常工作,因为它试图解析同时填充1.4.0和2.0.0的单个提供程序。 它的错误如下:

No provider "azurerm" plugins meet the constraint "=1.4.0,=2.0.0".

我之所以这样问,是因为我们拥有大型的Terraform代码库,并且如果可行,我希望逐位迁移。

曾经在这里提出过类似的问题:Terraform: How to install multiple versions of provider plugins? 但是没有有效的答案

2 个答案:

答案 0 :(得分:0)

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

Plugin Names and Versions

如果安装了多个版本的插件,Terraform将使用 符合配置版本限制的最新版本。

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

答案 1 :(得分:0)

如何使用同一个 Terraform provider 的多个版本

这使我们能够从 helm2 平稳过渡到 helm3,同时使新部署能够立即使用 helm3,从而减少技术债务的积累。

当然你可以对大多数供应商做同样的事情

我们是如何解决这个问题的

所以我们的想法是下载我们提供程序的特定版本(在我的例子中是 helm 0.10.6)并将其移动到 terraform 默认使用的文件系统镜像之一。关键部分是我们的插件二进制文件的重命名。在 zip 中我们可以找到 terraform-provider-helm_v0.10.6,但我们将其重命名为 terraform-provider-helm2_v0.10.6

PLUGIN_PATH=/usr/share/terraform/plugins/registry.terraform.io/hashicorp/helm2/0.10.6/linux_amd64
mkdir -p $PLUGIN_PATH
curl -sLo_ 'https://releases.hashicorp.com/terraform-provider-helm/0.10.6/terraform-provider-helm_0.10.6_linux_amd64.zip'
unzip -p _ 'terraform-provider-helm*' > ${PLUGIN_PATH}/terraform-provider-helm2_v0.10.6
rm _
chmod 755 ${PLUGIN_PATH}/terraform-provider-helm2_v0.10.6

然后当我们声明我们的两个提供者插件

我们可以使用文件系统镜像中的hashicorp/helm2插件,让terraform直接下载最新的hashicorp/helm provider,它使用helm3

terraform {
  required_providers {
    helm2 = {
      source = "hashicorp/helm2"
    }
    helm = {
      source = "hashicorp/helm"
      version = ">= 2.0.0"
    }
  }
}
# 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 {
    ...
  }
}

初始化terraform的时候,你会发现

- Finding latest version of hashicorp/helm...
- Finding latest version of hashicorp/helm2...

- Installing hashicorp/helm v2.0.2...
- Installed hashicorp/helm v2.0.2 (signed by HashiCorp)
- Installing hashicorp/helm2 v0.10.6...
- Installed hashicorp/helm2 v0.10.6 (unauthenticated)

使用它

从这一点来看,它非常简单。默认情况下,helm 资源将在 v2.0.2 中选择我们更新的 helm 提供程序。您必须明确地将 provider = helm2 用于旧资源(在我们的例子中为 helm_repositoryhelm_releases)。迁移后,您可以将其删除以使用默认的 helm 提供程序。