Terraform 的多个提供程序版本

Fab*_*ien 12 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".
Run Code Online (Sandbox Code Playgroud)

我问这个问题是因为我们有一个很大的 Terraform 代码库,如果可行的话我想一点一点地迁移。

曾经有人提出过类似的问题,这里:Terraform: How to install multiple versions ofprovider plugins? 但没有得到有效答案

ico*_*uel 6

如何使用同一 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
Run Code Online (Sandbox Code Playgroud)

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

我们可以使用hashicorp/helm2文件系统镜像中的插件,并让terraform直接下载最新的hashicorp/helm提供程序,该提供程序使用helm3

terraform {
  required_providers {
    helm2 = {
      source = "hashicorp/helm2"
    }
    helm = {
      source = "hashicorp/helm"
      version = ">= 2.0.0"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
# 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 {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

初始化terraform时,你会发现

terraform {
  required_providers {
    helm2 = {
      source = "hashicorp/helm2"
    }
    helm = {
      source = "hashicorp/helm"
      version = ">= 2.0.0"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用它

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


Lia*_*iam 0

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

插件名称和版本

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

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