ETA:在terraform github问题上找到讨论,https://github.com/hashicorp/terraform/issues/13103。已知且非常......“特质”......问题。
通过一个列表通过另外两个模块(从top.tf
到autoscaling_group
到launch_configuration
),两个都将变量定义为type = "list"
,我从terraform plan
得到以下投诉:
"Error: module.autoscaling_group.aws_launch_configuration.this:
security_groups: should be a list"
它似乎将参数识别为列表类型(如果我从变量声明中删除类型规范,它会抱怨)。但我找到的唯一方法就是将最终用法包装在列表括号中。这似乎违反直觉(我还没有看到当我这样做时apply
会发生什么) - 发生了什么?
序列:
top.tf
称security_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.tf
,terraform 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"]
}
}
我有同样的问题,应该在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)}"]
}