Terraform嵌套模块的调用和输出

时间:2019-01-23 09:45:02

标签: amazon-web-services terraform devops infrastructure-as-a-code

我正在开发基础架构,所以我将模块称为嵌套。

有我的文件系统树。

   ├── 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命令时,没有输出。

如何解决此问题。

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

模块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