Terraform循环模块

时间:2017-07-10 13:31:01

标签: amazon-web-services terraform

我的terraform文件中有一个模块,它创建了一些数据库服务器,可以执行一些操作。

首先,它创建一个自动缩放组来使用特定的图像,然后创建一些EBS卷并附加它们,然后添加一些lambda代码,这样在启动时实例就会注册到路径53.所以大约有80行文本。

提取

module "systemt-sql-db01" {
  source          = "localmodules/tf-aws-asg"
  name            = "${var.envname}-sys-db01"
  envname         = "${var.envname}"
  service         = "dbpx"
  ami_id          = "${data.aws_ami.app_sqlproxy.id}"
  user_data       = "${data.template_cloudinit_config.config-enforcement-sqlproxy.rendered}"
   #subnets         = ["${module.subnets-enforcement.web_private_subnets}"]
  subnets         = ["${element(module.subnets-enforcement.web_private_subnets, 1)}"]
  security_groups = ["${aws_security_group.unfiltered-egress-sg.id}", "${aws_security_group.sysopssg.id}", "${aws_security_group.system-sqlproxy.id}"]
  key_name        = "${var.keypair}"    

  load_balancers       = ["${var.envname}-enf-dbpx-int-elb"]
  iam_instance_profile = "${module.iam_profile_generic.profile_arn}"

  instance_type = "${var.enforcement_instancesize_dbpx}"

  min = 0
  max = 0
}

然后我有两个参数文件,一个是我在发布到预生产时调用的,另一个是在启动到生产时调用的。我不希望这些包含除变量之外的任何内容。

问题是,对于生产我需要调用模块两次,但是对于生产我需要调用三次。

人们谈论模块的计数功能,但我认为这还不可能。谁能建议任何其他方法来做到这一点?我想要的是能够在我的参数文件中设置所有DB ASG名称的列表变量,然后每次循环调用该模块。

我希望这有道理吗?

谢谢

1 个答案:

答案 0 :(得分:1)

这是Terraform中高度要求的功能,如前所述,尚不支持。 Terraform v0.12的更高版本将引入此功能(https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each)。

我遇到了类似的问题,我必须从基本KMS模块为多个帐户创建多个KMS密钥。我最终创建了一个使用核心KMS模块的第二个模块,该第二个模块具有该核心模块的许多实例,但是只需要我输入一次帐户详细信息即可。

这仍然不是理想的选择,但是在不使事情变得过于复杂的情况下,效果仍然很好。