使用模块循环输出变量

问题描述 投票:0回答:2

我从 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

我的问题是,如何循环变量以便我可以将每个卷附加到一个实例?

amazon-ec2 terraform terraform-provider-aws
2个回答
2
投票

模块中不支持计数,仅在资源中支持。 在您的实例中,您希望将

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])"
}

1
投票
声明 Terraform 模块时,

不支持“Count”。 您有 2 个选择:

    为每个实例和每个 ebs 卷声明模块。并将变量传递到没有“count.index”部分的模块中。
  1. 将 EC2 和 ESB 放在同一个模块中,因为它们离开彼此就无法真正工作。这是构建 terraform 项目的良好实践 - 为整个应用程序堆栈制作模块。因为当你有太多小模块时 - 它会变得有点混乱。
© www.soinside.com 2019 - 2024. All rights reserved.