在terraform仓库中,如何正确设置多个逻辑上组织的子文件夹?

34

目前我正在Azure上开发一个基础架构,包括以下内容:

  • 资源组
  • 应用程序网关
  • 应用服务
  • 等等

我所有的内容都在一个名为main.tf的文件中,我知道这是个错误,但我想从这里开始。我现在正试图将每个部分移动到自己的子文件夹中。大致如下:

terraform-repo/
├── applicationGateway/
│   ├── main.tf
│   ├── vars.tf
├── appService/
│   ├── main.tf
│   └── vars.tf
├── main.tf
└── vars.tfvars

然而,当我尝试从单文件结构转移时创建此文件时,我的远程状态出现了问题,它希望删除任何不属于当前正在工作的子文件夹的内容。

例如,如果我想运行terraform apply applicationGateway,我会得到以下信息:

  # azurerm_virtual_network.prd_vn will be destroyed

Plan: 0 to add, 2 to change, 9 to destroy.

在 Terraform 存储库中,设置多个逻辑组织的子文件夹的正确方法是什么?还是说我必须销毁当前环境才能像这样设置?


鼓励每个存储库只有一个模块。 - Matt Schuchard
3个回答

34
你看到这个问题是因为terraform忽略了子文件夹,所以那些资源不再被包括在内。你需要配置子文件夹作为Terraform模块,然后在根目录的main.tf中包含这些模块。

31
可以有人解释一下这背后的动机吗?我觉得很烦人,需要把所有tf文件放在一个目录中,而不能将其组织到子目录中。 - trubi
@trubi 只有 Hashicorp 能回答你的问题!不管怎样,嗨 MarkB,请更新链接:https://www.terraform.io/docs/language/modules/index.html - ADTC
(在我看来,这两个链接都有效) - Ben Millwood
@dur,你应该把这个反馈提交给HashiCorp。在这里发布不会有任何成效。 - Mark B
@dur,仅仅因为多年后还存在一些未解决的问题,并不意味着没有大量其他问题已经得到修复和关闭。你似乎更想找一个发泄和抱怨的地方,但这并不是正确的场所。 - Mark B
1
@MarkB 抱歉,我不想冒犯你。我不是在寻找抱怨的地方。只是我对一些重要问题仍未解决感到非常失望。然而,这是开源的,我应该知道这一点。 - dur

12

更新于 2022 年 06 月,完整示例:

假设你有以下目录:

./your-folder
|__ main.tf
|__ variables.tf
|__ output.tf
|__ /modules
    |__ /module-a
        |__ main.tf
        |__ variables.tf
        |__ output.tf

./your-folder/modules/module-a/main.tf 中的模块定义:

resource "[resource_type]" "my-module-name" {
   ...
}

在你的根main.tf文件中加载模块,这样在./your-folder/main.tf中:

module "my-module-instance-name" {
    source = "./modules/module-a"
    other-input-variable = "..."
}

然后告诉Terraform加载这个新模块,运行以下命令在你的根目录中(即./your-folder):
terraform get

然后使用terraform plan测试您的设置。

要在子模块中使用根级别资源,请将其作为输入变量注入到子模块中。

要在根模块中使用子级别资源,请使用输出指令从子模块中导出它。

希望这有所帮助。:)


2
需要指出的是,您可以在模块目录中拥有多个文件,无论文件命名如何,只要扩展名为“.tf”(我花了一些时间才意识到这一点)。 - robsonrosa

3

保持DRY环境的一种选择是使用Terragrunt

Terragrunt是Terraform的包装器,它以略微不同的方式处理组织和可重用组件,与Terraform处理环境的方式不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接