【问题标题】:Terraform upgrade and multiple versions.tf, do child modules inherit the provider versions?Terraform 升级和多个versions.tf,子模块是否继承提供者版本?
【发布时间】:2021-07-13 13:45:27
【问题描述】:

对 Terraform 不是很有经验。我将我的项目从 12 升级到 13,然后希望将其升级到 14。

按照文档说明,我运行了terraform 0.13upgradeterraform 0.13upgrade module,我的目录变成了这样:

 terraform
     ├── module
     │   ├── main.tf
     │   └── versions.tf
     ├── main.tf
     └── versions.tf

我移动了我的版本,但问题是我只在根 versions.tf 中指定了它们:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 3.8.0"
    }
}

module/versions.tf我只保留:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
    }
}

子模块是否从根(导入它们的位置)继承版本,或者这是否意味着我的模块将自动使用更新的提供程序版本(我认为是 3.64)运行?

我应该简单地删除模块/versions.tf 吗? (每次都要编辑两个版本很烦人)。

谢谢!

【问题讨论】:

  • 我建议你在模块中使用version.tf,以保持模块依赖版本锁定并在模块中明确定义,将其视为普通包版本,这样你只关心更新模块,及其提供者在升级或添加功能时的版本。

标签: terraform


【解决方案1】:

对于给定的 Terraform 配置(包括根模块和您可能调用的任何其他模块),每个提供程序只能有一个版本。 Terraform 认识到两个提供者是“相同的”,因为它们在规范化后具有相同的 source 值,并且在您的示例中,两者都使用 hashicorp/google,这是 registry.terraform.io/hashicorp/google 的缩写,因此它们都需要能够就使用该提供程序的特定版本达成一致。

Terraform 处理来自多个提供程序的版本约束,方法是将它们组合在一起并尝试同时遵守所有它们。在您的示例中,您没有在子模块中编写 version 参数,这意味着“允许任何版本”。

因此,Terraform 将寻找与 both ~> 3.8.0 约束和隐含的“任何版本”约束相匹配的可用提供程序版本,并且由于 ~> 3.8.0 约束是“任何版本”它实际上优先于子模块中的开放约束。这不是严格意义上的“继承”,但在这种情况下它的行为恰好有点像,因为子模块是完全不受约束的。

一个更有趣的例子是,如果你的两个模块都指定了不同的版本约束,这意味着我们可以看到组合它们的更有趣的效果。假设您的两个模块具有以下要求:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 3.8.2"
    }
  }
}
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = ">= 3.8.5"
    }
  }
}

在这种情况下,这些约束都不是另一个的子集,但它们确实有一些重叠:从 3.8.5 开始的所有 3.8.x 版本对于两个模块都是可接受的。因此,Terraform 将从该集合中选择最新的可用版本。

如果您编写的两个模块具有 冲突 版本约束,那么这将是一个错误:

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 3.7.0"
    }
  }
}
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 3.8.5"
    }
  }
}

没有提供者版本同时是 3.7.x 版本和 3.8.x 版本,因此任何版本都不可能同时满足这两个约束,因此提供者版本选择将失败。正是出于这个原因,Terraform 文档部分 Best Practices for Provider Versions 建议仅在根模块中使用 ~> 版本约束。

【讨论】:

  • 是否建议在每个模块中使用versions.tf,或者我可以只在顶级模块中使用吗?
  • 我意识到 terraform wrt 冲突提供程序版本的这种行为不在官方文档中(或者至少我在几次搜索后找不到它),应该添加它
  • 在 Terraform Provider Requirements 文档部分 Version Constraints 中有一些关于此的建议。
猜你喜欢
  • 2021-03-10
  • 2021-06-13
  • 2019-06-06
  • 2017-04-12
  • 2023-02-05
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多