1

我有许多嵌套模块的 terraform 设置。简化它看起来像这样

├── 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



在开发中的位置:

主文件

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
}

变量.tf

variable "localip" {
  type = string
}

env.dev.tfvars

localip = "1.1.1.1/32"



在 sec-groups 模块中:

主文件

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]
  }
}

变量.tf

variable vpc_id {}
variable localip {
  type = string
}

--

'terraform init' 产生预期的结果。但是,“terraform plan”会产生以下错误。对我来说,这表明一个空的 localip 变量,这意味着我没有正确声明该变量,是这样吗?

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" {
  }

提前致谢

--

% terraform -v
    Terraform v0.13.0
    + provider registry.terraform.io/hashicorp/aws v3.2.0
    + provider registry.terraform.io/hashicorp/random v2.3.0
4

2 回答 2

0

文件中的变量.tfvars分配给根模块。

如果您发布的代码实际上是在根级别,那么当您指定-var-file.

如果它实际上不在根级别,则很可能没有localip正确传递 var。您看到的事实Error: "" is not a valid CIDR block: invalid CIDR address:表明您在某处传递了一个空字符串。如果你不能.tfvars正确加载并且上面的代码实际上是在根级别,你会得到一个不同的错误(缺少变量),因为你没有为localip变量提供默认值。

于 2020-08-24T15:06:13.463 回答
0

事实证明我完全误解了模块是如何工作的。我假设子模块需要通过在子模块中指定多个模块块来使用来自父模块或其他子模块的变量。我发现我正在将变量从多个子模块传递给每个子模块,事后看来这似乎很奇怪,但当时并没有。

这意味着一些子模块试图在一个循环中多次重新实例化,因此会出现错误消息。我现在意识到野兽方法是让父模块调用子模块的输出值以传递给其他子模块,并且子模块不应使用与父模块中相同的变量相互引用。

感谢所有与此有关的指针,对于红鲱鱼引用 localip 变量表示歉意。

于 2020-09-28T09:25:47.097 回答