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

Posted

技术标签:

【中文标题】使 terraform 仅使用本地插件的规范方法【英文标题】:Canonical way to make terraform use only local plugins 【发布时间】:2022-01-21 13:29:34 【问题描述】:

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

    terraform provider mirror 命令 + provider_installation 在 .terraformrc(或 terraform.rc)中 terraform init -plugin-dir 命令 热身provider-plugin-cache

它们都是等价的吗?推荐哪一个?我的用例是为 CI/CD 管道构建“部署者”docker 映像,并且我正在考虑在 Terraspace 下使用 Terraform 的可能性。

【问题讨论】:

【参考方案1】:

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

使用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 尝试访问任何提供程序的原始注册表。

【讨论】:

【参考方案2】:

不确定 Terraspace。仅关于插件:

    terraform provider mirror command + provider_installation in .terraformrc(或 terraform.rc):似乎更安全的版本,但每次更改插件版本时都需要更新本地镜像。您是否可以为需要不同插件集或版本的不同配置重用相同的镜像位置,这不是很清楚。

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

使用此选项时,只有给定目录中的插件可用。

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

根据您是否有许多不同的配置、需要什么级别的安全性、您是否有能力频繁地更新缓存/镜像以遵循所需的版本,选择也可能不同。

【讨论】:

以上是关于使 terraform 仅使用本地插件的规范方法的主要内容,如果未能解决你的问题,请参考以下文章

使 Terraform 资源键多行

Terraform 应用抛出错误“等待插件启动时超时”

如何使用 Terraform 使 AWS CloudFront Distribution 缓存失效?

使用预安装的 Terraform 插件,而不是使用 terraform init 下载它们

在不使用 Terraform 文件配置器的情况下将本地文件部署到实例

terraform api 网关与 openapi 规范的集成