我有许多嵌套模块的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
开发位置:
main.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
}
variables.tf
variable "localip" {
type = string
}
env.dev.tfvars
localip = "1.1.1.1/32"
在sec-groups模块中:
main.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]
}
}
variables.tf
variable vpc_id {}
variable localip {
type = string
}
-
'terraform init'产生预期的结果。但是,“地形计划”会产生以下错误。对我来说,这表明是一个空的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
答案 0 :(得分:0)
.tfvars
文件中的变量已分配给根模块。
如果您发布的代码实际上是根级别的,则在您指定-var-file
时它将起作用。
如果它实际上不是根级别的,则很可能没有正确传递localip
var。您看到Error: "" is not a valid CIDR block: invalid CIDR address:
的事实表明您正在某个地方传递空字符串。如果您没有正确加载.tfvars
并且上面的代码实际上是在根级别,则将得到另一个错误(缺少变量),因为没有为localip
变量提供默认值。 / p>
答案 1 :(得分:0)
事实证明,我完全错过了对模块工作原理的理解。我假设子模块需要通过在子模块中指定多个模块块来使用父级或其他子模块中的变量。我发现我正在将变量从多个子模块传递到每个子模块,这在事后看来并不奇怪,但当时还没有。
这意味着某些子模块试图在循环中多次重新实例化,因此出现错误消息。我现在意识到,野兽方法是让父模块调用子模块的输出值以传递给其他子模块,并且子模块不应使用与父模块相同的变量相互引用。
感谢所有使用此方法的指针,对红色鲱鱼的歉意引用了localip变量。