Terraform-无法将字符串变量传递给子模块

Terraform-无法将字符串变量传递给子模块,terraform,terraform-aws-modules,Terraform,Terraform Aws Modules,我有很多嵌套模块的地形设置。看起来是这样的 ├── modules │ ├── sec-groups │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── variables.tf │ │ └── versions.tf ├── dev │ ├── env.dev.tfvars │ ├── main.tf │ ├── versions.tf │ └── variables.tf └── prod ├──

我有很多嵌套模块的地形设置。看起来是这样的

├── 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
}
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 "localip" {
  type = string
}
variable vpc_id {}
variable localip {
  type = string
}
env.dev.tfvars

localip = "1.1.1.1/32"


和在sec组模块中:

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
}
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 "localip" {
  type = string
}
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" {
  }
提前谢谢

--


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

如果您发布的代码实际上是根级别的,那么当您指定
-var文件时,它将起作用


如果它实际上不在根级别,则很可能没有正确地传递
localip
var。您看到的
错误:“”不是有效的CIDR块:无效的CIDR地址:
表示您正在某个地方传递空字符串。如果您没有正确加载
.tfvars
,并且上面的代码实际上处于根级别,则会出现另一个错误(缺少变量),因为您没有为
localip
变量提供默认值。

来自
文件的变量被分配给根模块

如果您发布的代码实际上是根级别的,那么当您指定
-var文件时,它将起作用


如果它实际上不在根级别,则很可能没有正确地传递
localip
var。您看到的
错误:“”不是有效的CIDR块:无效的CIDR地址:
表示您正在某个地方传递空字符串。如果您没有正确加载
.tfvars
,并且上面的代码实际上是根级别的,那么您将得到一个不同的错误(缺少变量),因为您没有为
localip
变量提供默认值。

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

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


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

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

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


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

我认为
env.dev.tfvars
不会自动加载到变量中。将文件重命名为
env.dev.auto.tfvars
,或者使用
-var file=“env.dev.tfvars”在命令行中指定它执行terraform plan&apply时的
参数。上述注释是正确的,但是您应该得到一个关于未设置的
localip
变量的错误,因为它在根模块
vars.tf
中不包含默认值。你有没有把东西稍微弄坏,把它拿走?或者这是一个完全的代码?标题是非常非常误导。。。您可以很好地传递变量。请在代码中查找为变量设置的
在哪里。
当我调用plan时,我使用“auto”指定
-var file=env.dev.auto.tfvars
似乎没有什么区别。@HelderSepulveda-我不明白为什么标题会有误导性。我已经将变量指定为“1.1.1.1”,据我所知,它没有传递给模块。有没有更好的方法来描述这一点?我认为
env.dev.tfvars
不会自动加载到变量中。将文件重命名为
env.dev.auto.tfvars
,或者使用
-var file=“env.dev.tfvars”在命令行中指定它执行terraform plan&apply时的
参数。上述注释是正确的,但是您应该得到一个关于未设置的
localip
变量的错误,因为它在根模块
vars.tf
中不包含默认值。你有没有把东西稍微弄坏,把它拿走?或者这是一个完全的代码?标题是非常非常误导。。。您可以很好地传递变量。请在代码中查找为变量设置的
在哪里。
当我调用plan时,我使用“auto”指定
-var file=env.dev.auto.tfvars
似乎没有什么区别。@HelderSepulveda-我不明白为什么标题会有误导性。我已经将变量指定为“1.1.1.1”,据我所知,它没有传递给模块。有没有更好的方法来描述这一点