我从 terraform 开始,正在构建一个小项目,只有一些 aws 实例,其中一个实例附加了 ebs 卷。
我相信我会开始更多地使用 terraform,所以我想通过定义模块来完成这项工作,然后我可以在其他项目中重用这些模块。
为此,我创建了 3 个模块(一个用于实例,另一个用于创建 ebs 卷,最后一个用于附加卷)。
在其他地方,我有一个“main.tf”,我在其中调用这些模块。我遇到的问题是,要创建和附加卷,我需要一些数据,例如实例ID。
为了获取 InstanceID,我在“实例”模块上定义了一个输出变量(它必须是一个列表,以防实例计数超过 1):
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
我的问题是,如何循环变量以便我可以将每个卷附加到一个实例?
模块中不支持计数,仅在资源中支持。 在您的实例中,您希望将
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])"
}