使 terraform 仅使用本地插件的规范方法

Canonical way to make terraform use only local plugins

据我所知,有三种方法可以使 Terraform 使用预填充的插件(以防止通过 init 命令从 Web 下载)。

  1. terraform provider mirror command + provider_installation in .terraformrc(或terraform.rc)
  2. terraform init -plugin-dir 命令
  3. 热身provider-plugin-cache

它们都是等价的吗?推荐哪一个?我的用例是为 CI/CD 管道构建“部署者”docker 图像,我也在考虑在 Terraspace.

下使用 Terraform 的可能性

不确定 Terraspace。仅关于插件:

  1. terraform provider mirror command + provider_installation in .terraformrc (or terraform.rc): 似乎更安全的版本,但它需要在你改变插件版本时更新本地镜像。对于需要不同插件集或版本的不同配置,是否可以重复使用相同的镜像位置还不是很清楚。

  2. terraform init -plugin-dir 命令:如果未预安装所需的插件和特定版本,terraform 命令将失败。这种方法似乎是最耗时和最能控制可用插件的方法。

When this option is used, only the plugins in the given directory are available for use.

  1. 预热provider-plugin-cache:这个可以重新使用预先下载的插件版本,并且还会在您更新约束时尝试下载新版本。如果您的缓存路径是可写的,则此方法将起作用。如果不是,那么 terraform 可能会作为第二个选项失败。这个选项貌似耗时最少,也更贴近本地开发。缓存不会自动清理,需要一些清理自动化。

取决于您是否有许多不同的配置,需要什么级别的安全性,您是否有能力更新 caches/mirrors 足够频繁以跟上所需的版本,选择也可能不同。

前两个是相互关联的,因为它们共享相同的底层机制:“文件系统镜像”插件安装方法。

使用 terraform init -plugin-dir 使 Terraform 生效 构造一个一次性 provider_installation 块,其中仅包含一个 filesystem_mirror 块引用给定的目录。它允许您仅通过一个安装操作获得该效果,而不是在一个中心位置为所有未来的命令配置它。

具体来说,如果您 运行 terraform init -plugin-dir=/example 那么这在功能上等同于以下 CLI 配置:

provider_installation {
  filesystem_mirror {
    path = "/example"
  }
}

插件缓存目录不同,因为 Terraform 仍将访问配置的安装方法(默认情况下,每个提供程序的原始注册表)但会跳过下载 插件包文件(实际上包含插件代码的文件,而不是关于版本的元数据)如果它已经在缓存中。同样,它会将下载的任何新插件包保存到缓存中以备将来使用。

因此,这不会阻止 Terraform 尝试安装它通过网络访问原始注册表遇到的任何 插件。这只是为了避免重复重新下载相同包的优化。


最后一种方法类似于第一种方法,但略有不同:Implied Local Mirror Directories

如果您的配置中没有 provider_installation 块,那么 Terraform 将通过搜索隐含的镜像目录并将它在其中找到的任何提供程序视为仅限本地的提供程序来为自己构建一个。例如,如果 /usr/share/terraform/plugins 包含任何版本的 registry.terraform.io/hashicorp/aws(官方 AWS 提供商),那么 Terraform 的行为就好像它配置如下:

provider_installation {
  filesystem_mirror {
    path    = "/usr/share/terraform/plugins"
    include = ["registry.terraform.io/hashicorp/aws"]
  }
  direct {
    exclude = ["registry.terraform.io/hashicorp/aws"]
  }
}

因此,这使得 Terraform 将本地目录视为该特定提供程序唯一可能的安装源,但仍允许 Terraform 在请求时从上游获取任何其他提供程序。


如果您的要求是 terraform init 完全不咨询任何远程服务 为了插件安装的目的,直接用于这种情况的方法是编写一个 provider_installation 块,其中只有一个 filesystem_mirror 块,因此这将禁用 direct {} 安装方法,从而阻止 Terraform 尝试访问 any 的原始注册表 提供商。