Estou pensando em criar um módulo que define o contexto de nível superior (um monte de constantes compartilhadas) para todos os módulos invocados subsequentemente. Para poupar cada módulo de ter que criar um objeto de módulo do módulo de contexto, quero que o módulo de nível de entrada crie esse objeto e o passe para todos os outros módulos como uma variável de entrada.
Eu tenho esse código e ele funciona:
├── main.tf
├── modules
│ ├── mod1
│ │ └── mod1.tf
│ ├── mod2
│ │ └── mod2.tf
principal.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
}
módulos/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}"
}
módulos/mod2/mod2.tf:
variable "var1" {
type = any
}
output "out1" {
value = "var1 is ${var.var1.out1}, var2 is ${var.var1.out2}"
}
Ao correr
$ terraform init && terraform plan
Eu entendo
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"
}
Isso é feito normalmente? Se não, há algum risco nessa abordagem, como o Terraform não suportar o recurso em uma versão futura?
Referir-se ao objeto que representa uma chamada de módulo é uma sintaxe válida do Terraform, e você pode usar esse resultado em qualquer local que espere um objeto do tipo apropriado. Essa é uma das técnicas frequentemente usadas em Module Composition .
No entanto, você usou
type = any
em seu exemplo, que afirma que este módulo poderia aceitar um valor de qualquer tipo. Uma maneira mais robusta de escrever isso, que portanto produziria uma mensagem de erro melhor se o primeiro módulo mudasse de uma forma que quebrasse suas suposições, seria declarar o tipo de objeto real que você está esperando:A expressão em seu
output "out1"
se refere diretamente aos atributosout1
eout2
, então é impreciso escrever que sua variável pode aceitar um valor de qualquer tipo: este módulo falharia se qualquer um desses atributos fosse omitido.A restrição de tipo especial
any
é destinada apenas a situações em que seu módulo pode aceitar literalmente qualquer tipo, como se você estivesse passando o valor da variável para uma função comojsonencode
ouyamlencode
onde qualquer tipo é permitido.