我需要在有条件的基础上运行模块,并且还需要从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"。