terraform:通过模块传递列表,得到“错误:......应该是一个列表”

问题描述 投票:1回答:1

ETA:在terraform github问题上找到讨论,https://github.com/hashicorp/terraform/issues/13103。已知且非常......“特质”......问题。


通过一个列表通过另外两个模块(从top.tfautoscaling_grouplaunch_configuration),两个都将变量定义为type = "list",我从terraform plan得到以下投诉:

"Error: module.autoscaling_group.aws_launch_configuration.this: 
security_groups: should be a list"

它似乎将参数识别为列表类型(如果我从变量声明中删除类型规范,它会抱怨)。但我找到的唯一方法就是将最终用法包装在列表括号中。这似乎违反直觉(我还没有看到当我这样做时apply会发生什么) - 发生了什么?


序列:

  • top.tfsecurity_group
  • top.tf也调用autoscaling,传递安全组id输出的列表。
  • autoscaling调用launch_configuration,传递参数。

这是布局,.tf文件的内容如下。

.
├── autoscaling_group
│   └── main.tf
├── launch_configuration
│   └── main.tf
├── security_group
│   └── main.tf
└── top.tf

top.tf发起的电话是:

module "autoscaling_group" {
  source = "launch_configuration"
  security_groups = ["${module.security_group.id}"]
  }

令人讨厌的用法是在launch_configuration/main.tf

resource "aws_launch_configuration" "this" {
  name_prefix = "foobar"
  image_id = "this_is_fake"
  instance_type = "ts.small"
  security_groups = "${var.security_groups}"
  }
  • 如果我添加括号:["${var.security_groups}"]我没有得到错误。
  • 如果我从type = "list"的变量定义块中删除launch_configuration/main.tfterraform plan抱怨:module.autoscaling_group.var.security_groups: variable security_groups in module autoscaling_group should be type string, got list

top.tf的内容:

provider "aws" {
  region = "us-east-1"
  }

module "security_group" {
  source = "security_group"
  }

module "autoscaling_group" {
  source = "launch_configuration"
  security_groups = ["${module.security_group.id}"]
  }

autoscaling_group/main.tf的内容:

variable "security_groups" {
  type = "list"
  description = "The security groups to attach to launched instances."
  }

module "launch_configuration" {
  source = "launch_configuration"
  security_groups = "${var.security_groups}"
  }

resource "aws_autoscaling_group" "service_autoscaling_group" {

  name_prefix = "foobar"

  min_size = 1
  max_size = 1
  health_check_type = "EC2"
  launch_configuration = "${module.launch_configuration.name}"
  vpc_zone_identifier = ["this_is_fake"]
  }

launch_configuration/main.tf的内容:

variable "security_groups" {
  type = "list"
  description = "The security groups to attach to launched instances."
  }

output "name" {
  value = "${aws_launch_configuration.this.name}"
  }

resource "aws_launch_configuration" "this" {
  name_prefix = "foobar"
  image_id = "this_is_fake"
  instance_type = "ts.small"
  security_groups = "${var.security_groups}"
  }

再次,如果我在最后一个赋值["${var.security_groups}"]的RHS周围括起括号,我没有看到terraform plan的错误。但是terraform将变量识别为一个列表(因为如果我从声明中删除type = "list",它会抱怨它是一个列表类型)。那么为什么它会抱怨它在这里有一个列表?

security_group/main.tf的内容:

output "id" {
  value = "${aws_security_group.this.id}"
  description = "The security group ID."
  }

resource "aws_security_group" "this" {

  name_prefix = "foobar"
  vpc_id      = "this_is_fake"
  description = "foobar"

  egress {
    from_port       = 0
    to_port         = 0
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
    }
  }
list module terraform variable-types
1个回答
1
投票

我有同样的问题,应该在v0.12:https://github.com/hashicorp/terraform/issues/18923#issuecomment-434901762中解决

如果你想传递一个列表作为模块参数,这里是一个小的黑客来做它。我只是发送一个字符串,然后将其解析为一个列表(AWS Backup模块示例):

Terra form.台风

module "your_module" {
  source = "./module_path"

  list_as_string = "${var.element_1};${var.element_1}"
}

./module_path/variables.台风

variable "list_as_string" {
  description = "List in string"
}

./module_path/卖弄.台风

resource "resource" "exemple" {
  real_list = ["${split(";", var.list_as_string)}"]
}
© www.soinside.com 2019 - 2024. All rights reserved.