如何动态地将参数传递给地形模块,并根据条件运行模块



我需要在有条件的基础上运行模块,并且还需要从map变量动态构建被调用模块的参数列表。

我的主。Tf文件如下所示

provider "aws" {
region = var.region
}
module "CreateResource1" {
source = "./modules/CreateResource1"
ProductName = "Test1"
ProductColour = "Red"
ProductShape = "Hexagone"
}

module "CreateResource2" {
source = "./modules/CreateResource2"
ProductName = "Test2"
ProductType = "xyz"
ProductModel = "abc"
ProductPrice = ""

}

需求是一个条件变量module_name哪个用户将通过,基于此,我需要根据每个条件执行任意一个模块。

也不是传递像ProductName, productcolor, ProductShape这样的参数作为一个单独的变量,用户将把它们作为一个字典变量传递,我想用键和值动态地为模块构建变量。

用户输入如下:

module "Resource" {
module_name = "CreateResource1"
parameters = {
ProductName = "Test1"
ProductColour = "Red"
ProductShape = "Hexagone"
}
}

根据上面的输入,我需要选择要运行的模块并为模块构建参数。

因为我是新的地球化任何线索将不胜感激。使用的版本是1.0.0

如果可能的话,我会更改模块以接受像调用模块那样的映射:

(免责声明:部分的,未经测试的例子)

模块/资源/main.tf

variable "module_name" {
type = string
}
variable "parameters" {
type = map
}
module "CreateResource1" {
source = "../CreateResource1"
count = var.module_name == "CreateResource1" ? 1 : 0
parameters = var.parameters
}
module "CreateResource2" {
source = "../CreateResource2"
count = var.module_name == "CreateResource2" ? 1 : 0
parameters = var.parameters
}

main.tf

module "Resource" {
source = "./modules/resource"
module_name = "CreateResource1"
parameters = {
ProductName = "Test1"
ProductColour = "Red"
ProductShape = "Hexagone"
}
}

被调用的模块需要一个小的修改来定义map类型的parameter输入变量,然后可以使用lookup函数(例如lookup(var.parameters, "ProductName", ""))在代码中访问这些值-注意第三个参数允许您指定一个默认值,如果元素不存在于映射中。没有理由不能从输入变量中获取该值,所以如果您不想在这里硬编码它,您可以(例如,从调用模块中的默认设置传递它,并传递给所有/部分子模块)。例如:

模块/CreateResource1 main.tf(部分)

variable "parameters" {
type = map
}
resource "some_resource_type" "some_resource_name" {
ProductName = lookup(var.parameters, "ProductName", "Product1")
ProductColour = lookup(var.parameters, "ProductColour", "Red")
ProductShape = lookup(var.parameters, "ProductShape", "Circle")
}

所以在这个例子中,由CreateResource1创建的资源需要3个参数。如果它们存在于模块Resource传递的映射中,则将使用它们,对于传入的映射中不存在的任何映射,将使用默认值(在本例中为"Product1", "Red"),"Circle"。

最新更新