Terraform 嵌套模块调用和输出

Posted

技术标签:

【中文标题】Terraform 嵌套模块调用和输出【英文标题】:Terraform Nested Module Calling and Outputs 【发布时间】:2019-06-16 20:49:19 【问题描述】:

我正在处理基础架构配置,因此我将模块称为嵌套。

这是我的文件系统树。

   ├── main.tf
   └── modules
       ├── client.tf
       └── in
          └── main.tf

我的文件如下所示。

   #main.tf 
   module "my_vpc" 
          source = "./modules"
   

   # modules/client.tf
   provider "aws" 
          region = "us-east-2"
   

   module "inner" 
          source = "./in"
   

  # in/main.tf

  provider "aws" 
        region = "us-east-2"
  

  resource "aws_vpc" "main" 
        cidr_block = "10.0.0.0/16"
  

  output "vpc_id" 
      value = "$aws_vpc.main.id"
  

所以在我的例子中,我想获得来自 in/main.tf 中资源创建模块的输出。但是当我运行 terraform apply 命令时没有输出。

我该如何解决这个问题?

【问题讨论】:

'Not a valid output for module' when using output variable with terraform的可能重复 【参考方案1】:

您使用了两个模块,但只有一个输出语句。

./main.tf./modules/client.tf 创建模块 my_vpcclient.tf 中,您从./modules/in/main.tf 创建模块inner

模块inner 有一个输出vpc_id 定义在./modules/in/main.tf 您还需要在./modules/client.tf 级别进行输出语句。您想要输出的任何模块都必须具有该变量的输出语句,即使输出链接内部模块的输出也是如此。

# ./modules/client.tf
provider "aws" 
   region = "us-east-2"


module "inner" 
   source = "./in"


output "vpc_id" 
   value = "$modules.inner.vpc_id"

现在./modules/client.tf 中定义的模块在顶层输出你想要的值。您可以像这样在./main.tf 中与它进行交互:

#main.tf 
module "my_vpc" 
   source = "./modules"


locals 
   vpc_id = "$modules.my_vpc.vpc_id"


# output the vpc id if you need to
output "vpc_id" 
   value = "$modules.my_vpc.vpc_id"

附带说明,随着您扩大 terraform 和模块的使用,保持一致会有所帮助。如果您要在另一个模块中包含一个模块,我建议您使用一致的文件夹结构,如下所示。

├── main.tf
└── modules
   ├── vpc
      ├── modules
      ├  └── in
      ├     └── main.tf
      └── client.tf
   └── another_module
      └── main.tf

【讨论】:

我也将输出称为嵌套,谢谢兄弟! 很高兴我能帮上忙,如果答案解决了您的问题,您能否将答案标记为已接受?

以上是关于Terraform 嵌套模块调用和输出的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 用户 TF_VAR 不工作的嵌套模块

Terraform 模块 - 输出变量作为另一个模块的输入

Terraform 是不是支持带有少量操作的 CloudFormation 模板

需要说明如何使用 Terraform 管理 Google Cloud 项目

如何在Ansible set_fact中使用fact?

Terraform - 模块输出到文件