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

Posted

技术标签:

【中文标题】具有 Terraform 的多个提供程序版本【英文标题】:Multiple provider versions with Terraform 【发布时间】:2020-08-29 15:19:23 【问题描述】:

有谁知道是否可以有一个使用多个提供程序版本的 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? 但它没有得到有效的答案

【问题讨论】:

您可以逐个模块迁移,因为您的提供程序版本将/应该在根配置中指定。这将使这成为可能。唯一的问题是状态维护。 【参考方案1】:

如何使用同一个 Terraform 提供者的多个版本

这使我们能够从 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/helmprovider,使用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 提供程序。

【讨论】:

【参考方案2】:

不,你不能做你想做的事。 Terraform 期望您的约束与一个插件版本相匹配,如以下内容所示:

Plugin Names and Versions

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

所以你的约束不能被解析以匹配任何插件,因此错误

【讨论】:

这也是我怀疑的,所以不幸的是没有改变来进行平滑升级。谢谢! 有兴趣的可以看source code here

以上是关于具有 Terraform 的多个提供程序版本的主要内容,如果未能解决你的问题,请参考以下文章

在具有私有 GKE 集群的 Terraform 上使用 Kubernetes 提供程序

具有 Beta 参数的 Google Cloud Platform 资源的正确 Terraform 提供程序配置是啥?

Terraform azure 不兼容的提供程序版本

Terraform - 为变量指定多个可能的值

使用 terragrunt 的“无效的旧提供程序地址”

在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源