使用Terraform管理多个服务提供商的版本

9

请问是否有可能编写一个 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?,但是没有得到有效的答案。

您可以逐个模块地迁移,因为您的提供程序版本应该在根配置中指定。这将使此操作成为可能。唯一的问题是状态维护。 - Matt Schuchard
2个回答

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

当我们声明两个提供商插件时

我们可以使用来自文件系统镜像的hashicorp/helm2插件,并让terraform直接下载最新的hashicorp/helm提供商,它使用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资源将选择我们更新的helm提供程序v2.0.2。旧资源(helm_repositoryhelm_releases在我们的情况下)必须显式地使用provider = helm2。完成迁移后,您可以删除它以使用默认的helm提供程序。


0

不,你不能做你想做的事情。Terraform希望你的限制与插件名称和版本中所示的一个插件版本匹配。

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

因此,你的限制无法解析为匹配任何一个插件,因此会出现错误。


这也是我怀疑的,所以很遗憾没有进行平稳升级的变化。谢谢! - Fabien
1
如果您感兴趣,可以在此处查看源代码 - Liam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接