Terraform 子模块不会从根模块继承提供程序

Gui*_*ume 2 terraform

我的问题

\n

我在为我的模块定义提供程序时遇到问题。\n当我运行时,Terraform 无法找到提供程序的插件,terraform init并且当我运行时,它会显示我的模块的错误提供程序terraform providers

\n

设置

\n

我在 Debian 11 上使用 Terraform版本 1.3.7

\n

这是我正在尝试做的一个例子。

\n

我有一个 main.tf,其中是我的主要配置和模块。在此示例中,我使用单个模块来创建 Docker 容器。

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modules/\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 container_module/\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n
Run Code Online (Sandbox Code Playgroud)\n

在根模块project/main.tf文件中,我定义提供程序并调用该模块:

\n
terraform {                                                                     \n  required_providers {                                                          \n    docker = {                                                                  \n      source  = "kreuzwerker/docker"                                            \n      version = "3.0.1"                                                         \n    }                                                                           \n  }                                                                             \n}                                                                               \n                                                                                 \nprovider "docker" {                                                             \n  host = "unix:///var/run/docker.sock"                                          \n}                                                                               \n                                                                                \nmodule "container" {                                                            \n  source = "./modules/container_module"                                         \n}                                                                               \n
Run Code Online (Sandbox Code Playgroud)\n

在 中modules/container_module/main.tf,我创建了 docker 容器资源:

\n
resource "docker_image" "debian" {\n  name = "debian:latest"\n}\n\nresource "docker_container" "foo" {\n  image = docker_image.debian.image_id\n  name  = "foo"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我期望发生什么

\n

当我运行时terraform init,它应该从 下载提供商的插件kreuzwerker/docker

\n

实际发生了什么

\n

相反,terraform 会从一次下载插件kreuzwerker/docker,然后尝试再次从hashicorp/docker.

\n

这是命令的输出:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modules/\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 container_module/\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.tf\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行时,terraform providers根据文件我会得到两个不同的源:

\n
terraform {                                                                     \n  required_providers {                                                          \n    docker = {                                                                  \n      source  = "kreuzwerker/docker"                                            \n      version = "3.0.1"                                                         \n    }                                                                           \n  }                                                                             \n}                                                                               \n                                                                                 \nprovider "docker" {                                                             \n  host = "unix:///var/run/docker.sock"                                          \n}                                                                               \n                                                                                \nmodule "container" {                                                            \n  source = "./modules/container_module"                                         \n}                                                                               \n
Run Code Online (Sandbox Code Playgroud)\n

根据文档,子模块应从其父模块继承提供程序:
\n默认行为:继承默认提供程序

\n
\n

如果子模块没有声明任何配置别名,则providers参数是可选的。如果省略它,子模块将从其父模块继承所有默认提供程序配置。(默认提供程序配置是不使用别名参数的配置。)

\n
\n

我已经检查过了

\n\n

我的问题

\n

我应该如何声明我的提供程序,以便子模块可以从根模块继承提供程序?

\n

Mar*_*cin 5

kreuzwerker/docker不是Hashicorp 提供商。因此,正如此处所解释的,您必须required_providers在每个模块中显式定义,因为此类提供程序不会被继承。