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

时间:2018-09-25 17:13:07

标签: 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"
}

然后我运行:

~$ terraform get
~$ terraform apply

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

如果有帮助:

~$ terraform --version
v0.10.8

3 个答案:

答案 0 :(得分:4)

在Terraform 0.12之前

  • 以下命令显示特定模块的输出

    terraform output -module=example_module
    

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.
    
  2. 要从Terraform 0.12及更高版本中的模块获取输出,必须使用调用程序模块中的输出块从根模块(例如example_module)导出它们。

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

    output "example_module_outputs" {
      value = module.example_module
    }
    
  3. 现在您可以看到运行以下命令的输出:
    terraform output
    

答案 1 :(得分:2)

Terraform仅默认显示来自root的输出 https://www.terraform.io/docs/commands/output.html

您可以使用以下命令从world模块获取输出:

terraform output -module=world

我认为这里的逻辑是模块的输出将被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"
}

答案 2 :(得分:0)

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

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

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

如果我们在模块内的输出组中有 1 个以上的输出:

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

    output "world_world_module_says" {
      value = module.world.world_module_says
    }

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

    output "world_module_says" {
        value = "hello from world module"
    }
    output "world_module_says_again" {
        value = "hi again from world module"
    }

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

  1. 使用 -json 标志并使用 jq 命令操作输出:
    terraform output -json world_world_module_says |jq '.'"world_module_says" 
  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
    }