我从terraform开始,正在构建一个小项目,只是一些附有ebs卷的aws实例。
我相信我将开始更多地使用terraform,因此我想通过定义可以在其他项目中重用的模块来完成这项工作。
为此,我创建了3个模块(一个用于实例,另一个用于创建ebs卷,最后一个用于附加卷)。
在另一个地方,我有一个“ main.tf”,我在其中调用这些模块。我遇到的问题是,创建和附加卷需要一些数据,例如instanceID。
要获取InstanceID,我在“实例”模块上定义了一个输出变量(如果实例计数超过一个,则必须为列表):
output "instance_id" {
value = ["${aws_instance.instance.*.id}"]
}
然后,在我的main.tf文件中,在模块上调用该变量:
module "aws-instance" {
source = "../../Terraform/aws-instance"
instance_type = "t2.micro"
instance_count = "2"
}
(some other code...)
module "aws-volume-attachment" {
source = "../../Terraform/aws-volume-attachment"
device_name = "/dev/sdf"
instance_id = "${element("${module.aws-instance.instance_id}", count.index)}"
volume_id = "${element("${module.aws-ebs-volume.volume_id}", count.index)}"
}
但是我得到一个错误:
Error: module "aws-volume-attachment": count variables are only valid within resources
我的问题是,如何遍历变量,以便将每个卷附加到一个实例?
答案 0 :(得分:0)
“计数”为not supported。 您有2个选择:
为每个实例和每个ebs卷声明模块。并将变量传递到没有“ count.index”部分的模块中。
将EC2和ESB都放在同一模块中,因为它们彼此之间不能真正起作用。这是构造terraform项目的一个好习惯-为整个应用程序堆栈制作模块。因为当您有太多小模块时,它会变得有些混乱。
答案 1 :(得分:0)
模块仅在资源中不支持计数。在您的实例中,您希望将instance_count
的值传递给实例,卷和附件模块。然后,您将在模块内(在资源级别)将instance_count
的值用于count
。
如果使用的是count
,则您的aws-instance module
将输出instance_ids
的“列表”。这些卷也一样。
将这些列表传递到aws-volume-attachment
模块中(instance_id
和volume_id
变量必须为list
类型,然后使用count.index
遍历这些列表。
对不起,我在使用Azure时并不熟悉AWS提供程序,但是希望它能显示出原理。
resource "aws-volume-attachment" {
count = "${var.instance_count}"
...
volume_id = "${var.volume_ids[count.index]}"
instance_id = "${var.instance_ids[count.index])"
}