List terraform:通过模块传递列表,获得;错误:。。。应该是一个列表;
ETA:在terraform github问题中找到讨论。众所周知而且非常。。。“特殊的”。。。问题List terraform:通过模块传递列表,获得;错误:。。。应该是一个列表;,list,module,terraform,variable-types,List,Module,Terraform,Variable Types,ETA:在terraform github问题中找到讨论。众所周知而且非常。。。“特殊的”。。。问题 通过两个其他模块(从top.tf到autoscaling\u group到launch\u configuration)传递列表后,这两个模块都将变量定义为type=“list”,我从地形图收到以下投诉: "Error: module.autoscaling_group.aws_launch_configuration.this: security_groups: should be a l
通过两个其他模块(从
top.tf
到autoscaling\u group
到launch\u configuration
)传递列表后,这两个模块都将变量定义为type=“list”
,我从地形图收到以下投诉:
"Error: module.autoscaling_group.aws_launch_configuration.this:
security_groups: should be a list"
它似乎将参数识别为列表类型(如果我从变量声明中删除类型规范,它会抱怨)。但我发现消除错误的唯一方法是将最终用法用列表括号括起来。这似乎违反直觉(我还没有看到当我这样做时,apply
会发生什么情况)-发生了什么
顺序如下:
top.tf
调用security\u组
top.tf
还调用autoscaling
,传递带有安全组id
输出的列表
autoscaling
调用launch\u配置
,将参数传递给
这是布局,下面是.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\u 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}"
}
provider "aws" {
region = "us-east-1"
}
module "security_group" {
source = "security_group"
}
module "autoscaling_group" {
source = "launch_configuration"
security_groups = ["${module.security_group.id}"]
}
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"]
}
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}"
}
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"]
}
}
- 如果我添加括号:
[“${var.security\u groups}”]
我不会得到错误
- 如果我从
launch\u configuration/main.tf
中的变量定义块中删除type=“list”
,terraform plan
抱怨:module.autoscaling\u group.var.security\u groups:module autoscaling\u groups中的变量安全组应该是字符串类型,got list
top.tf的内容
:
resource "aws_launch_configuration" "this" {
name_prefix = "foobar"
image_id = "this_is_fake"
instance_type = "ts.small"
security_groups = "${var.security_groups}"
}
provider "aws" {
region = "us-east-1"
}
module "security_group" {
source = "security_group"
}
module "autoscaling_group" {
source = "launch_configuration"
security_groups = ["${module.security_group.id}"]
}
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"]
}
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}"
}
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"]
}
}
autoscaling\u group/main.tf的内容:
resource "aws_launch_configuration" "this" {
name_prefix = "foobar"
image_id = "this_is_fake"
instance_type = "ts.small"
security_groups = "${var.security_groups}"
}
provider "aws" {
region = "us-east-1"
}
module "security_group" {
source = "security_group"
}
module "autoscaling_group" {
source = "launch_configuration"
security_groups = ["${module.security_group.id}"]
}
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"]
}
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}"
}
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"]
}
}
launch\u 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}"
}
provider "aws" {
region = "us-east-1"
}
module "security_group" {
source = "security_group"
}
module "autoscaling_group" {
source = "launch_configuration"
security_groups = ["${module.security_group.id}"]
}
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"]
}
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}"
}
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"]
}
}
同样,如果我将括号括在上一个赋值[“${var.security\u groups}”]
的RHS上,我看不到地形平面图的错误。但是terraform将变量识别为列表(因为如果我从声明中删除type=“list”
,它会抱怨它是列表类型)。那么,为什么它会抱怨希望这里有一个列表呢
security\u group/main.tf的内容
:
resource "aws_launch_configuration" "this" {
name_prefix = "foobar"
image_id = "this_is_fake"
instance_type = "ts.small"
security_groups = "${var.security_groups}"
}
provider "aws" {
region = "us-east-1"
}
module "security_group" {
source = "security_group"
}
module "autoscaling_group" {
source = "launch_configuration"
security_groups = ["${module.security_group.id}"]
}
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"]
}
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}"
}
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中解决:
如果您想将列表作为模块参数传递,这里有一个小技巧。我只发送一个字符串,然后将其解析为一个列表(AWS备份模块的示例):
terraform.tf
/模块路径/variables.tf
/模块路径/main.tf
这是一个已知的问题,似乎:@!$!!%##$!!!