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



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

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

"计数"在声明Terraform模块时不支持。您有2个选项:

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

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

计数仅在模块中,仅在资源中支持。在您的实例中,您需要将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])"
}

相关内容

  • 没有找到相关文章

最新更新