问题描述
我有一个用于ec2的模块,在其中我创建了8个实例,并为8个不同的sg创建了一个不同的模块。 现在我想将2或3 sg分配给ec2实例。这样每个ec2都有不同的SG集。
我能够通过模块事物将相同的SG分配给所有ec2,但不能将不同的SG分配给其他SG。
您能帮我吗..?
module "ec2" {
source = "../../euc-terraformcontrol-compute"
ami_id = "${element(split(",",var.ami_id),0)},${element(split(",1)},2)},3)},4)},5)},6)},7)}"
instance_count = "${element(split(",var.instance_count),0)}"
root_volume_size = "${element(split(",var.root_volume_size),0)}"
subnet = "subnet-01f72b25d394c4a3b,subnet-02aa0eeb3e901dea8,subnet-05a7668477dbbca72"
iam_instance_profile = "${element(split(",var.iam_instance_profile),0)}"
security_group = "${element(split(",module.security_groups.security_group_04_id),module.security_groups.security_group_05_id),1)}" instance_type = "${element(split(",var.instance_type),7)}"
instance_name = "${element(split(",var.instance_name),7)}"
}
解决方法
问题始于抽象之一。您想分层多远?您尝试将抽象放入模块的单个调用中的次数越多,您的实现就会变得越复杂,越难理解。可以将安全组的ec2调用分为第二个调用。 roles and profiles in puppet引入了一种非常好的思考方式。您的ec2模块就像一个配置文件。每次您使用一组不同的参数调用ec2模块时,它都是一个新角色。
您没有发布模块,因此很难提供特定的答案,但是使用所有逗号分隔,看起来您正在通过字符串创建数组。这使得很难不阅读就难以阅读和理解。看一看其他complex types地形,例如地图,列表或对象。该语言具有用于处理这些类型的内置功能。
您可能具有安全组的映射以及要尝试创建的实例的对象的列表,以及要分别传递的其他信息,例如root_volume_size,amd_id。每个对象都可以具有构成您的安全组映射的安全组的名称。 (看看所有这些抽象如何变得难以解释吗?)
尽管在您的实例中,我仍然建议再次调用ec2模块。您现在甚至可以在模块上支持count或for_each。因此,也许您需要拆散子集并分别创建安全组。将SG传递到子网创建模块中。