【问题标题】:How to use Terraform modules for code re-use?如何使用 Terraform 模块进行代码重用?
【发布时间】:2020-11-28 02:28:21
【问题描述】:

Terraform v0.12.x

在阅读文档后,我以为我理解了用于代码重用的 Terraform 模块,但显然不是。

假设我想构建一个目标组+EC2 实例基础架构。我有这个目录结构。

/terraform
/terraform/green.tf
/terraform/blue.tf
/terraform/module_ec2/ec2.tf
/terraform/module_tg/tg.tf

例如,/terraform/module_ec2/ec2.tf 有这个

resource "aws_instance" "ec2" {
  ami               = var.ami
  availability_zone = var.availability_zone
  ....
}

/terraform/module_tg/tg.tf

resource "aws_lb_target_group" "tg" {
  name = var.tg_name
  ...
}

我希望blue.tfgreen.tf 使用module_tgmoodule_ec2 构建各自的目标组+EC2 基础架构,并将每个模块所需的相应键/值对传递给它们。我该怎么做,即blue.tfgreen.tf的内容是什么?

【问题讨论】:

  • terraform.io/docs/configuration/modules.html: module "ec2" { source="./module_ec2" ... } ...
  • 我可以在blue.tfgreen.tf 文件中包含多个模块吗?如果是这样,我该如何构建blue.tf 而不是green.tf,反之亦然?
  • 是的,每个文件中可以有多个模块。不,你不能独立运行绿色和蓝色,它们在同一个目录中,因此属于同一个部署。
  • 啊,我明白了,那么我该如何重构我的目录结构,以便我可以分别运行 bluegreen 目标,但仍然可以为其他模块重用代码?也许您可以将其放在答案中,因为这一切都说得通。请注意,我有 bluegreen 部署共有的文件(非模块)。谢谢!
  • 另外,如果我需要 green 运行的输出,而我在 blue 运行中需要它呢?例如,green 运行创建了一个 EBS 卷,blue 运行如何获取它?

标签: terraform terraform-provider-aws


【解决方案1】:

考虑沿生命周期边界分解您的 terraform 配置。一组资源的生命周期是从您运行terraform apply 开始到您运行terraform destroy 结束的时间。

在您的示例和 cmets 中,您打开了一个 EBS 卷,它应该对绿色和蓝色堆栈都可用。 EBS 卷或任何其他超过任一堆栈的依赖项都应位于单独的文件夹中。

要从每个堆栈访问 EBS 卷或其他长期依赖项的详细信息,有几个选项:

  1. 使用terraform_remote_state 数据源指向您的依赖项配置的远程状态。
  2. 采用命名约定,以便可以使用特定数据源发现依赖关系
  3. 第 1 项的变体,在您的依赖配置的子文件夹中创建一个输出模块,其中包括 terraform_remote_state 并仅公开配置的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2017-01-28
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多