为什么我的 Terraform 输出在模块中不起作用?

GDe*_*Dev 8 terraform

我有以下简单的设置:

~$ tree
.
??? main.tf
??? modules
    ??? world
        ??? main.tf
~$ cat main.tf
output "root_module_says" {
    value = "hello from root module"
}
module "world" {
    source = "modules/world"
}
~$ cat modules/world/main.tf
output "world_module_says" {
    value = "hello from world module"
}
Run Code Online (Sandbox Code Playgroud)

然后我运行:

~$ terraform get
~$ terraform apply
Run Code Online (Sandbox Code Playgroud)

我希望在输出中看到 world_module_says,但我没有,我只看到 root_module_says。这真的很令人困惑,为什么?

如果有帮助:

~$ terraform --version
v0.10.8
Run Code Online (Sandbox Code Playgroud)

9bO*_*fw5 11

Terraform 仅显示 root 的输出(默认情况下 v0.12 之前) https://www.terraform.io/docs/commands/output.html

在 Terraform 0.12 之前,您可以使用以下命令从 world 模块获取输出:

terraform output -module=world
Run Code Online (Sandbox Code Playgroud)

我认为这里的逻辑是模块的输出将由 root 使用,如果您确实需要输出,那么您也可以在 root 中输出它,因此 main.tf 可能包含以下内容:

output "root_module_says" {
    value = "hello from root module"
}
output "world_module_says" {
    value = "${module.world.world_module_says}"
}
module "world" {
    source = "modules/world"
}
Run Code Online (Sandbox Code Playgroud)

从 Terraform 0.12 开始,这是从模块内获取输出的唯一方法。


小智 7

使用多个输出变量时扩展上述答案:

当访问模块输出组时(使用控制台或脚本中的“terraform output”命令),Terraform 将以格式化方式打印该组中的所有输出变量,或使用“-json”标志以 json 格式打印。

提取输出值时,仅当存在单个具有字符串格式的变量时,我们才能使用“-raw”标志。

如果模块内的输出组中有超过 1 个输出:

假设我们在“根”模块中声明了模块中的以下输出组:

    output "world_world_module_says" {
      value = module.world.world_module_says
    }
Run Code Online (Sandbox Code Playgroud)

在模块 main.tf 中我们有 2 个变量:

    output "world_module_says" {
        value = "hello from world module"
    }
    output "world_module_says_again" {
        value = "hi again from world module"
    }
Run Code Online (Sandbox Code Playgroud)

从组中提取单个输出变量的两种方法:

  1. 使用 -json 标志并使用jq命令操作输出:
    terraform output -json world_world_module_says |jq '.'"world_module_says" 
Run Code Online (Sandbox Code Playgroud)
  1. 另一种方法是在“root”模块中单独声明每个输出,以便使用“-raw”轻松访问:
    output "world_world_module_says" {
      value = module.world.world_module_says
    }
    output "world_world_module_says_again" {
      value = module.world.world_module_says_again
    }
Run Code Online (Sandbox Code Playgroud)


Ami*_*dav 6

Terraform 0.12 之前

Terraform 0.12 之后

  1. 以下命令在 Terraform 0.12 及更高版本中失败并出现错误:

    terraform output -module=example_module
    
    Error: Unsupported option
    
    The -module option is no longer supported since Terraform 0.12, because now
    only root outputs are persisted in the state.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要从 Terraform 0.12 及更高版本中的模块获取输出,您必须example_module使用调用者模块中的输出块从根(例如)模块导出它们。

    现在只需在调用者模块中添加一行即可完成此操作,如下所示:

    output "example_module_outputs" {
      value = module.example_module
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在您可以看到运行以下命令的输出:
    output "example_module_outputs" {
      value = module.example_module
    }
    
    Run Code Online (Sandbox Code Playgroud)