使用第三方模块时,terraform init 无法获取来自 terraform 提供者镜像的模块

terraform init unable to fetch modules coming from terraform providers mirror when using third party modules

我正在使用此指令预取我的提供商:

terraform providers mirror  /usr/share/terraform/providers

mirrors.tf 看起来像这样:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>2.27"
    }
    kubernetes = {
      source = "hashicorp/kubernetes"
      version = "~>1.13"
    }
    okta = {
      source  = "okta/okta"
      version = "~> 3.22"
    }

之后,我将自己定位在一个 terraform 文件夹中,我打算在其中初始化之前应该预取的 okta 模块:

terraform {
  cloud {
    organization = "my-organization"

    workspaces {
      name = "my-workspace"
    }
  }
}

provider "okta"  {
  org_name    = "org_name"
  base_url    = "base_url"
  client_id   = "client_id"
  scopes      = [ "scope1" ]
  private_key = "private_key"
}

当对 hashicorp 模块执行相同操作时,效果很好。但是使用 okta terraform init 最终会像 :

Initializing provider plugins...
- Finding latest version of hashicorp/okta...
╷
│ Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider hashicorp/okta: provider registry.terraform.io/hashicorp/okta was not found in any of the search locations
│
│   - /usr/share/terraform/providers

查看 /usr/share/terraform/providers 时,我发现 terraform 有一个 okta/okta 文件夹和一个 hashicorp/kubernetes.

我如何告诉 terraform 在 okta/okta 而不是 hashicorp/okta 中寻找 okta 提供者?

谢谢

您显示的 mirrors.tf 文件包含一组 provider requirements,其中包括镜像命令为您请求的 okta/okta 提供程序的引用。

为了在其他 Terraform 模块中使用相同的提供程序,您应该将相同的 required_providers 块放置在将使用 okta/okta 提供程序的每个模块的 terraform 块中。然后,Terraform 将理解,在该模块中,您打算将短名称“okta”表示为 okta/okta,而不是默认的 hashicorp/okta.

Terraform 默认采用 hashicorp/ 命名空间中的提供程序,以便向后兼容最初为 Terraform v0.12 或更早版本编写的模块,这些模块尚不支持 third-party 提供程序的自动安装像这个。但是,如果您使用的是当前的 Terraform 版本(我写这篇文章时 v1.1 是最新的,但一直到 v0.13 都是如此),那么您通常应该在中包含一个 required_providers 块您编写的每个模块都是为了明确该模块所依赖的提供者,除非您需要您的模块 remain compatible with Terraform v0.12.