有条件地在 Terraform 中创建单个模块

rsy*_*rsy 20 terraform hcl terraform-modules

我一直在尝试有条件地使用根模块中的模块,以便在某些环境下不会创建该模块。许多人声称,通过count使用条件将模块中的 设为 0 或 1 即可达到目的。

module "conditionally_used_module" {
  source = "./modules/my_module"
  count  = (var.create == true) ? 1 : 0
}
Run Code Online (Sandbox Code Playgroud)

然而,这改变了 的类型conditionally_used_module:我们将拥有一个包含单个对象的列表(或元组),而不是对象(或映射)。是否有另一种方法可以实现此目的,而不意味着更改模块的类型?

Mih*_*ncu 14

要有条件地创建模块,您可以使用变量,假设它create_modulevariables.tfmodule 的文件中调用conditionally_used_module

然后,对于模块内的每个资源,conditionally_used_module您将使用count有条件地创建或不创建该特定资源。

下面的示例应该可以工作并为您提供所需的效果。

# Set a variable to know if the resources inside the module should be created
module "conditionally_used_module" {
  source = "./modules/my_module"
  create_module = var.create
}

# Inside the conditionally_used_module file
# ( ./modules/my_module/main.tf ) most likely 
# for every resource inside use the count to create or not each resource
resource "resource_type" "resource_name" {
 count = var.create_module ? 1 : 0
 ... other resource properties 
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可行,但有点 hacky。我希望 Terraform 官方支持有条件的 (19认同)
  • 与OP指出的问题相同。模块中的所有资源都变成列表。 (3认同)
  • 如果您为已创建的现有资源添加此计数 hack,它将重新创建该资源。当我需要修改资源以不在 DR 区域中创建而是在主区域中创建时,我遇到了此问题。 (3认同)
  • 是的,安迪,这是正确的。当您对以前创建的资源使用计数器时,它将强制重新创建。如果您不希望重新创建资源而只更新代码以使用计数器,您还可以使用 terraform state mv 将现有资源移动到计数器 [0]。但要小心使用此命令,创建状态备份以强制推送任何出错的情况 (2认同)