1. 概述

Terraform 是一个基础设施即代码(Infrastructure-as-Code, IaC)工具,用于自动化部署和管理云资源。它通过 Provider 与云平台和 SaaS(Software-as-a-Service) 服务进行交互。Terraform 中的 Provider 提供了各种 资源类型数据源

在本教程中,我们将讨论如何查看 Terraform 配置中使用的所有 Provider 的版本。本文使用的 Terraform 版本为 1.9.3。

2. 示例配置

我们使用如下 Terraform 配置文件 example.tf,其中包含了三个 Provider:

$ cat example.tf
provider "kubernetes" {
}

resource "local_file" "hello" {
    file_name = "hello.txt"
}

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
} 
  • 第一个 provider 块是显式声明的 Providerprovider "kubernetes" 中的 kubernetes 表示该 Provider 的本地名称。Kubernetes Provider 用于与 Kubernetes 平台交互。
  • 另外两个 resource 块隐式声明了 Provider
    • local_file 中的 local 表示使用的是 local Provider,file 是资源类型。local_file 用于生成指定内容的本地文件。
    • aws_instance 中的 aws 表示使用 AWS Provider。aws_instance 用于创建 Amazon EC2 实例。

3. 使用 terraform version

我们可以使用 terraform version 命令来查看当前配置中使用的 Provider 版本。

初始化之前运行:

$ terraform version
Terraform v1.9.3
on linux_amd64

此时还没有 Provider 被安装,所以只显示 Terraform 的版本。

接着使用 terraform init 初始化配置:

$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/local...
- Finding latest version of hashicorp/aws...
- Finding latest version of hashicorp/kubernetes...
- Installing hashicorp/local v2.5.1...
- Installed hashicorp/local v2.5.1 (signed by HashiCorp)
- Installing hashicorp/aws v5.61.0...
- Installed hashicorp/aws v5.61.0 (signed by HashiCorp)
- Installing hashicorp/kubernetes v2.31.0...
- Installed hashicorp/kubernetes v2.31.0 (signed by HashiCorp)
...

可以看到,Terraform 自动下载并安装了所需的 Provider 插件。

再次运行 terraform version

$ terraform version
Terraform v1.9.3
on linux_amd64
+ provider registry.terraform.io/hashicorp/aws v5.61.0
+ provider registry.terraform.io/hashicorp/kubernetes v2.31.0
+ provider registry.terraform.io/hashicorp/local v2.5.1

输出结果中列出了所有已安装的 Provider 及其版本。

3.1 使用 JSON 格式输出

如果你希望以 JSON 格式查看,可以加上 -json 参数:

$ terraform version -json
{
  "terraform_version": "1.9.3",
  "platform": "linux_amd64",
  "provider_selections": {
    "registry.terraform.io/hashicorp/aws": "5.61.0",
    "registry.terraform.io/hashicorp/kubernetes": "2.31.0",
    "registry.terraform.io/hashicorp/local": "2.5.1"
  },
  "terraform_outdated": false
}

建议:在脚本中解析版本信息时,使用 JSON 格式会更方便。

4. 查看 .terraform 目录

Terraform 在执行 init 后会在当前目录下生成一个隐藏目录 .terraform,里面包含了 Provider 插件的本地副本。

我们可以直接查看该目录来获取 Provider 版本信息:

$ ls -l .terraform/providers/registry.terraform.io/hashicorp/
total 12
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:57 aws
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:57 kubernetes
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:56 local

每个 Provider 对应一个子目录,目录名即为 Provider 名称。

进一步查看每个 Provider 的版本目录:

$ ls -l .terraform/providers/registry.terraform.io/hashicorp/aws
total 4
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:57 5.61.0
$ ls -l .terraform/providers/registry.terraform.io/hashicorp/kubernetes
total 4
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:57 2.31.0
$ ls -l .terraform/providers/registry.terraform.io/hashicorp/local
total 4
drwxr-xr-x 3 ubuntu ubuntu 4096 Aug  4 14:56 2.5.1

⚠️ 注意.terraform 目录通常不提交到 Git 仓库中,因为它包含的是本地缓存的 Provider 插件。

5. 总结

在本文中,我们介绍了两种查看 Terraform 配置中 Provider 版本的方法:

  • ✅ 使用 terraform version 命令:直接、标准、支持 JSON 输出,适合脚本使用。
  • ✅ 查看 .terraform 目录:适用于离线查看或调试,但需要手动查找目录结构。

两种方式各有优劣,建议根据实际场景选择使用。如果你在 CI/CD 流水线中需要自动化获取版本信息,推荐使用 -json 格式解析。


原始标题:Getting the Versions of All Providers in a Terraform Workspace