在 terraform repo 中设置多个逻辑上组织的子文件夹的正确方法是什么?

Pab*_*ero 7 directory structure backend terraform devops

目前,我正在开发一个 azure 基础设施,其中包括以下内容:

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

我所拥有的一切都在一个main.tf文件中,我知道这是一个错误,但我想从那里开始。我目前正在尝试将每个部分移动到我的回购中自己的子文件夹中。看起来像这样:

terraform-repo/
??? applicationGateway/
?   ??? main.tf
?   ??? vars.tf
??? appService/
?   ??? main.tf
?   ??? vars.tf
??? main.tf
??? vars.tfvars
Run Code Online (Sandbox Code Playgroud)

但是,当我在尝试从单个文件结构移动时创建它时,我的远程状态出现问题,它想删除不属于当前处理的子文件夹的任何内容。例如,如果我想运行,terraform apply applicationGateway我将得到以下信息:

  # azurerm_virtual_network.prd_vn will be destroyed

Plan: 0 to add, 2 to change, 9 to destroy.
Run Code Online (Sandbox Code Playgroud)

在 terraform repo 中设置多个逻辑上组织的子文件夹的正确方法是什么?或者我是否必须破坏我当前的环境才能像这样设置它?

thi*_*t_p 12

更新 06/2022,完整示例:

假设您有以下目录

./your-folder
|__ main.tf
|__ variables.tf
|__ output.tf
|__ /modules
    |__ /module-a
        |__ main.tf
        |__ variables.tf
        |__ output.tf
Run Code Online (Sandbox Code Playgroud)

模块定义在./your-folder/modules/module-a/main.tf

resource "[resource_type]" "my-module-name" {
   ...
}
Run Code Online (Sandbox Code Playgroud)

在根main.tf文件中加载模块,因此./your-folder/main.tf

module "my-module-instance-name" {
    source = "./modules/module-a"
    other-input-variable = "..."
}
Run Code Online (Sandbox Code Playgroud)

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

terraform get
Run Code Online (Sandbox Code Playgroud)

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

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

要使用根模块中的子级资源,请使用输出指令将其从子模块中导出。

希望这可以帮助。:)

  • 重要的是要指出,模块目录中可以有多个文件,无论文件命名如何,只要扩展名是“.tf”(我花了一些时间才意识到这一点) (2认同)

Mar*_*k B 11

您看到此问题是因为 terraform 忽略子文件夹,因此根本不再包含这些资源。您需要将子文件夹配置为Terraform Modules,然后将这些模块包含在您的根目录中main.tf

  • 有人可以解释这背后的动机吗?我觉得很烦人,我需要将所有 tf​​ 文件放在一个目录中,而不是用子目录组织它。 (4认同)