Terraform:使用模块循环输出变量

时间:2019-05-19 19:18:53

标签: amazon-ec2 terraform terraform-provider-aws

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

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

2 个答案:

答案 0 :(得分:0)

声明Terraform模块时,

“计数”为not supported。 您有2个选择:

  1. 为每个实例和每个ebs卷声明模块。并将变量传递到没有“ count.index”部分的模块中。

  2. 将EC2和ESB都放在同一模块中,因为它们彼此之间不能真正起作用。这是构造terraform项目的一个好习惯-为整个应用程序堆栈制作模块。因为当您有太多小模块时,它会变得有些混乱。

答案 1 :(得分:0)

模块仅在资源中不支持计数。在您的实例中,您希望将instance_count的值传递给实例,卷和附件模块。然后,您将在模块内(在资源级别)将instance_count的值用于count

如果使用的是count,则您的aws-instance module将输出instance_ids的“列表”。这些卷也一样。

将这些列表传递到aws-volume-attachment模块中(instance_idvolume_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])"
}