Terraform: impossibile passare la variabile stringa al modulo figlio

Aug 21 2020

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

Tiemen Aug 24 2020 at 22:06

Le variabili di un .tfvarsfile 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 localipcorrettamente 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 .tfvarscorrettamente 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 localipvariabile.

Adam Sep 28 2020 at 16:25

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.