我正在考虑创建一个模块,为随后调用的所有模块设置顶级上下文(一组共享常量)。为了避免每个模块必须创建上下文模块的模块对象,我希望入门级模块创建该对象并将其作为输入变量传递给所有其他模块。
我有这段代码并且它可以工作:
├── main.tf
├── modules
│ ├── mod1
│ │ └── mod1.tf
│ ├── mod2
│ │ └── mod2.tf
主程序:
module mod1 {
source = "./modules/mod1"
var1 = "hello"
var2 = "world"
}
module mod2 {
source = "./modules/mod2"
var1 = module.mod1
}
output "mod1" {
value = module.mod1
}
output "mod2" {
value = module.mod2
}
模块/mod1/mod1.tf:
variable "var1" {
type = string
}
variable "var2" {
type = string
}
output "out1" {
value = "In module1; got var1 = ${var.var1}"
}
output "out2" {
value = "In module1; got var2 = ${var.var2}"
}
模块/mod2/mod2.tf:
variable "var1" {
type = any
}
output "out1" {
value = "var1 is ${var.var1.out1}, var2 is ${var.var1.out2}"
}
跑步时
$ terraform init && terraform plan
我明白了
Changes to Outputs:
+ mod1 = {
+ out1 = "In module1; got var1 = hello"
+ out2 = "In module1; got var2 = world"
}
+ mod2 = {
+ out1 = "var1 is In module1; got var1 = hello, var2 is In module1; got var2 = world"
}
通常会这样做吗?如果不是,这种方法是否存在任何风险,例如 Terraform 在未来版本中不支持该功能?
引用表示模块调用的对象是有效的 Terraform 语法,您可以在任何需要适当类型对象的位置使用该结果。这是模块组合中经常使用的技术之一。
但是,您在示例中使用了
type = any
声明此模块可以接受任何类型的值。编写此代码的更可靠方法是声明您期望的实际对象类型,这样如果第一个模块发生更改而违反了您的假设,则会产生更好的错误消息:您中的表达式
output "out1"
直接引用out1
和属性,因此写您的变量可以接受任何out2
类型的值是不准确的:如果省略其中任何一个属性,该模块就会失败。特殊
any
类型约束仅适用于模块可以接受任何类型的情况,例如将变量值传递给函数jsonencode
或yamlencode
允许任何类型的情况。