1.7.15.3.1. terraform providers lock
terraform providers lock
会查询上游 registry(默认情况下),以便将 Provider 的依赖项信息写入依赖项锁文件。
更新依赖项锁定文件的常见方法是由 terraform init
命令安装 Provider 时生成,但在某些情况下,这种自动生成的方法可能不够:
如果您在使用其他 Provider 程序安装方法(例如文件系统或网络镜像)的环境中运行 Terraform,则常规的 Provider 安装程序将不会访问 Provider 程序在 Registry 上的源,因此 Terraform 将无法填充所有可能的包校验和选定的 Provider 版本。
如果您使用
terraform lock
将 Provider 程序的官方版本校验和写入依赖项锁定文件中,则将来的terraform init
运行将根据之前记录的官方校验和验证所选镜像中可用的软件包,从而进一步确保镜像返回的 Provider 程序的确是官方版本。如果您的团队在多个不同平台上运行 Terraform(例如在 Windows 和 Linux 上),并且 Provider 的上游 Registry 无法使用最新的哈希方案提供签名的校验和,则后续在其他平台上运行 Terraform 可能会添加额外的校验和锁定文件。您可以通过使用
terraform providers lock
命令为您打算使用的所有平台预先填充哈希值来避免这种情况。
terraform providers lock
仅在 Terraform v0.14 或更高版本中可用。
1.7.15.3.1.1. 用法
terraform providers lock [options] [providers...]
在没有额外的命令行参数的情况下,terraform providers lock
将分析当前工作目录中的代码,以查找它所依赖的所有 Provider 程序,并且将从其源 Registry 中获取有关这些 Provider 程序的关键数据,然后更新依赖项锁文件,写入所有选定的 Provider 程序版本以及 Provider 程序开发人员的私钥签名的包校验和。
警告:terraform providers lock
命令会打印有关其获取的内容以及每个包是否使用加密签名进行签名的信息,但它无法自动验证 Provider 提供者是否值得信赖以及它们是否符合您的本地系统策略或相关法规。在将更新的锁定文件提交到版本控制系统之前,请检查输出中的签名密钥信息,以确认您信任所有签名者。
如果您在命令行上列出一个或多个 Provider 程序源地址,则 terraform providers lock
将其工作仅限于这些提供程序,而其他提供程序(如果有的话)的锁定条目保持不变。
我们可以使用以下附加选项定制该命令的行为:
-fs-mirror=PATH
- 命令 Terraform 在给定的本地文件系统镜像目录中查找提供程序包,而不是在上游注册表中。给定目录必须使用通常的文件系统镜像目录布局。-net-mirror=URL
- 命令 Terraform 在给定的网络镜像服务中查找提供程序包,而不是在上游注册表中。给定的 URL 必须实现 Terraform Provider 网络镜像协议。-platform=OS_ARCH
- 设置打算用于处理此 Terraform 配置的平台。Terraform 将确保 Provider 程序均可用于指定的平台,并将在锁文件中保存足够的包校验和以至少支持指定的平台。可以多次设置此选项以包含多个目标系统的校验和。
目标平台名称由操作系统和 CPU 架构组成。例如,linux_amd64 选择在 AMD64 或 x86_64 CPU 上运行的 Linux 操作系统。
我们将在后续节中讲述有关于此参数的更多详细信息。
-enable-plugin-cache
- 启用全局配置的插件缓存的使用。这将加快锁定过程。默认情况下不启用此功能,因为插件缓存不是权威来源。由于terraform providers lock
命令用于确保使用受信任的 Provider 程序版本,因此从缓存安装插件被认为是有风险的。
1.7.15.3.1.2. 指定目标平台
例如,在我们的团队中可能既有在 Windows 或 macOS 工作站上使用 Terraform 配置的开发人员,也有在 Linux 上运行 Terraform 配置的自动化系统。
在这种情况下,我们可以选择验证所有 Provider 程序是否支持所有这些平台,并通过运行 terraform providers lock
并指定这三个平台来预先填充锁文件所需的校验和:
terraform providers lock \
-platform=windows_amd64 \ # 64-bit Windows
-platform=darwin_amd64 \ # 64-bit macOS
-platform=linux_amd64 # 64-bit Linux
(上面的示例使用 Unix 风格的 shell 包装语法来提高可读性。如果您在 Windows 上运行该命令,则需要将所有参数放在一行上,并删除反斜杠和注释。)
1.7.15.3.1.3. 内部 Providers 的锁条目
所谓内部 Provider 程序是还没有在真正的 Terraform Provider 注册表上发布的 Provider 程序,因为它仅在特定组织内开发和使用,并通过文件系统镜像或网络镜像进行分发。
默认情况下,terraform providers lock
命令假定所有 Provider 程序都是在 Terraform Provider 程序注册表中可用,并尝试联系源注册表以访问有关提供程序包的所有细节信息。
要为仅在本地镜像中可用的特定 Provider 程序创建锁定条目,可以使用 -fs-mirror
或 -net-mirror
命令行选项来覆盖查询 Provider 程序的原始注册表的默认行为:
terraform providers lock \
-fs-mirror=/usr/local/terraform/providers
-platform=windows_amd64 \
-platform=darwin_amd64 \
-platform=linux_amd64 \
tf.example.com/ourcompany/ourplatform
(上面的示例使用 Unix 风格的 shell 包装语法来提高可读性。如果您在 Windows 上运行该命令,则需要将所有参数放在一行上,并删除反斜杠和注释。)
由于上面的命令包含 Provider 程序源地址 tf.example.com/ourcompany/ourplatform
,因此 terraform providers lock
将仅尝试访问该特定 Provider 程序,并将保留所有其他 Provider 程序的锁条目不变。如果我们有来自不同来源的各种不同的 Provider 程序,可以多次运行 terraform providers lock
并每次指定不同的 Provider 程序子集。
-fs-mirror
和 -net-mirror
选项与 Provider 程序安装方法配置中的 filesystem_mirror
和 network_mirror
块具有相同的含义,但仅配置其中之一,以便明确您打算从何处派生包校验和信息。
请注意,只有原始注册表可以提供开发人员的原始加密签名所签署的官方校验和。因此,从文件系统或网络镜像创建的锁条目将仅覆盖您请求的确切平台,并且记录的校验和将是镜像报告的校验和,而不是原始注册表的官方校验和。如果要确保记录的校验和是由原始 Provider 发布者签名的校验和,请运行不带 -fs-mirror
或 -net-mirror
选项的此命令,以从原始注册表中获取所有信息。
如果您愿意,您可以通过内部 Provider 程序注册表发布您的内部 Provider 程序,然后该注册表将允许锁定和安装这些 Provider 程序,而无需任何特殊选项或额外的 CLI 配置。有关详细信息,请参阅 Provider 注册协议。