我的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名称的列表变量,然后每次循环调用该模块。
我希望这有道理吗?
谢谢
答案 0 :(得分:1)
这是Terraform中高度要求的功能,如前所述,尚不支持。 Terraform v0.12的更高版本将引入此功能(https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each)。
我遇到了类似的问题,我必须从基本KMS模块为多个帐户创建多个KMS密钥。我最终创建了一个使用核心KMS模块的第二个模块,该第二个模块具有该核心模块的许多实例,但是只需要我输入一次帐户详细信息即可。
这仍然不是理想的选择,但是在不使事情变得过于复杂的情况下,效果仍然很好。