【问题标题】:To create or not to create multiple modules based on user input根据用户输入创建或不创建多个模块
【发布时间】:2022-02-01 02:04:55
【问题描述】:

在多个帖子中寻找这个问题的答案,但只找到了更简单场景的解决方案。
假设我有一个名为a 的模块,而这个模块依赖于多个不同的模块,我们称它们为bc

module "a" {
   source     = ./a
   depends_on = [module.B, module.C]
   b_id       = module.b.id
   c_id       = module.c.id
}

module "b" {
   source     = ./b
}

module "c" {
   source     = ./c
}

在天真的场景中,两个模块 bc 将在我们创建模块 a 之前创建,但是如果我想让模块 a 的用户创建它自己的 b 实例怎么办和c,只需将他们的ID 传递给a,我们无需创建bc
我知道count 资源上的技巧详细@ 987654321@,但它只适用于资源而不是模块,为了让它在这里工作,我需要将它应用于模块内的每个资源,这将创建一个繁琐的代码.
我也看到了 terraform conditional creation of objects,但是如果主模块/资源只有一个条件属性,这个解决方案效果很好,如果我们有 10 个模块可以由用户提供给我们或需要内联创建怎么办?

【问题讨论】:

  • 你可以有一个条件,其中 true 评估为模块 bc 的声明,它们的输出映射到 a 输入,而 false 评估为没有模块声明 bcdata 映射到 a 输入(也不会为 true 声明)。我可以用更具体的细节更具体,或者我可以写下那个答案。
  • @MattSchuchard 感谢您的回复。 one conditional 到底是什么意思?

标签: terraform


【解决方案1】:

只要您使用的是 Terraform v0.13 或更高版本,您就可以在 module 块中使用 count

module "a" {
   source = "./a"

   b_id = one(module.b[*].id)
   c_id = one(module.c[*].id)
}

module "b" {
   source = "./b"
   count  = 1
}

module "c" {
   source = "./c"
   count  = 0
}

这里使用the one function 是为了将自然是零元素或一个元素的列表转换为可能为空的单个值。因此,您的模块“a”必须准备好接受null 作为此处b_idc_id 的有效值,以处理这些模块的实例为零的情况。

请注意,在module "a" 的参数中引用module.bmodule.c 会自动声明对这些模块的所有输出的依赖关系,因此在depends_on 中也包含depends_on 是多余的堵塞。 depends_on 只能用于“隐藏的依赖”,不会反映在资源之间的数据流中。

【讨论】:

  • 谢谢老兄!很好的答案!
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2018-03-12
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多