Terraform: impossibile passare la variabile stringa al modulo figlio
Ho una configurazione terraform con un numero di moduli nidificati. Semplificato sembra così
├── modules
│ ├── sec-groups
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── variables.tf
│ │ └── versions.tf
├── dev
│ ├── env.dev.tfvars
│ ├── main.tf
│ ├── versions.tf
│ └── variables.tf
└── prod
├── env.prod.tfvars
├── main.tf
├── versions.tf
└── variables.tf
Dove in dev:
principale.tf
module "aws_dev_sec-groups" {
source = "../modules/sec-groups"
vpc_name = aws_vpc.dev_bp_vpc
vpc_id = aws_vpc.dev_bp_vpc.id
localip = var.localip
}
variabili.tf
variable "localip" {
type = string
}
env.dev.tfvars
localip = "1.1.1.1/32"
E nel modulo sec-groups:
principale.tf
resource "aws_security_group" "servers_sg" {
name = "servers_sg"
description = "Traffic allowed to and from Servers"
vpc_id = var.vpc_id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = [var.localip]
}
}
variabili.tf
variable vpc_id {}
variable localip {
type = string
}
--
'terraform init' produce i risultati attesi. Tuttavia, 'terraform plan' produce il seguente errore. Per me questo suggerisce una variabile localip vuota, il che significa che non sto dichiarando correttamente la variabile, è così?
Error: "" is not a valid CIDR block: invalid CIDR address:
on ../modules/sec-groups/main.tf line 63, in resource "aws_security_group" "servers_sg":
63: resource "aws_security_group" "servers_sg" {
}
Grazie in anticipo
--
% terraform -v
Terraform v0.13.0
+ provider registry.terraform.io/hashicorp/aws v3.2.0
+ provider registry.terraform.io/hashicorp/random v2.3.0
Risposte
Le variabili di un .tfvars
file vengono assegnate al modulo root.
Se il codice che hai pubblicato è effettivamente a livello di root, funzionerà, quando specifichi il file -var-file
.
Se non è effettivamente a livello di root, molto probabilmente non stai trasmettendo localip
correttamente la var. Il fatto che vedi Error: "" is not a valid CIDR block: invalid CIDR address:
indica che stai passando una stringa vuota da qualche parte. Se non caricassi .tfvars
correttamente e il codice sopra fosse effettivamente a livello di root, otterresti un errore diverso (variabile mancante), poiché non hai fornito un valore predefinito per la localip
variabile.
Si scopre che ho completamente capito male come funzionano i moduli. Ho ipotizzato che i sottomoduli dovessero utilizzare le variabili del genitore o di altri sottomoduli specificando più blocchi di moduli all'interno del sottomodulo. Ho scoperto che stavo passando variabili da più sottomoduli a ogni sottomodulo, il che sembra strano col senno di poi, ma al momento non lo era.
Ciò significava che alcuni sottomoduli stavano tentando di ricreare un'istanza più volte, in un ciclo, da qui i messaggi di errore. Ora mi rendo conto che l'approccio bestiale è che il modulo genitore chiami i valori di output dei sottomoduli da passare ad altri sottomoduli e che i sottomoduli non dovrebbero fare riferimento l'uno all'altro usando le stesse variabili di quelle nel modulo genitore.
Grazie per tutti i suggerimenti con questo, ci scusiamo per la falsa pista che fa riferimento alla variabile localip.