根据用户输入创建或不创建多个模块
To create or not to create multiple modules based on user input
在多个帖子中寻找过此问题的答案,但只找到了针对更简单场景的解决方案。
假设我有一个名为 a
的模块,这个模块依赖于多个不同的模块,我们称它们为 b
和 c
.
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
}
在天真的场景中,模块 b
和 c
将在我们创建模块 a
之前创建,但是如果我想让模块 a
的用户怎么办? ] 来创建它自己的 b
和 c
实例,然后将它们的 ID 传递给 a
,而无需我们创建 b
和 c
.
我知道 count
资源细节技巧 ,但它只适用于资源而不适用于模块,为了让它在这里工作,我需要将它应用到模块内的每个资源,这将创建一个繁琐的代码。
我还看到了 terraform conditional creation of objects 但是如果 main module/resource 只有一个条件属性,这个解决方案就很好用,如果我们有 10 个模块可以由用户提供给我们或者需要内联创建怎么办?
只要您使用 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 是为了将自然包含零个或一个元素的列表转换为可能为 null 的单个值。因此,您的模块“a”必须准备好接受 null
作为 b_id
和 c_id
的有效值,以处理这些模块的实例为零的情况。
请注意,在 module "a"
的参数中引用 module.b
和 module.c
会自动声明对这些模块的所有输出的依赖性,因此也包括在内是多余的depends_on
在 module "a"
块中。 depends_on
应仅用于“隐藏的依赖项”,这些依赖项不会反映在资源之间的数据流中。
在多个帖子中寻找过此问题的答案,但只找到了针对更简单场景的解决方案。
假设我有一个名为 a
的模块,这个模块依赖于多个不同的模块,我们称它们为 b
和 c
.
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
}
在天真的场景中,模块 b
和 c
将在我们创建模块 a
之前创建,但是如果我想让模块 a
的用户怎么办? ] 来创建它自己的 b
和 c
实例,然后将它们的 ID 传递给 a
,而无需我们创建 b
和 c
.
我知道 count
资源细节技巧
我还看到了 terraform conditional creation of objects 但是如果 main module/resource 只有一个条件属性,这个解决方案就很好用,如果我们有 10 个模块可以由用户提供给我们或者需要内联创建怎么办?
只要您使用 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 是为了将自然包含零个或一个元素的列表转换为可能为 null 的单个值。因此,您的模块“a”必须准备好接受 null
作为 b_id
和 c_id
的有效值,以处理这些模块的实例为零的情况。
请注意,在 module "a"
的参数中引用 module.b
和 module.c
会自动声明对这些模块的所有输出的依赖性,因此也包括在内是多余的depends_on
在 module "a"
块中。 depends_on
应仅用于“隐藏的依赖项”,这些依赖项不会反映在资源之间的数据流中。