我试图通过Terraform实例化3个知道彼此ip地址的aws_instances。这当然会导致循环依赖。我想知道克服这个问题的最佳方法是什么。我尝试了几种解决方案:
- 将两个实例实例化在一起,然后实例化一个依赖于这两个实例的实例。在第三个实例中,有一个user_data脚本,该脚本允许该实例ssh到其他2个实例中以设置必要的配置
它是有效的,但我不喜欢它创建了两组不同的资源,尽管这三个实例在初始化后的意图和目的都是相同的。
- 同时实例化这3个实例,然后实例化另一个实例,其唯一目的是ssh到每个实例中以设置必要的配置。初始化完成后,附加实例应自行终止
它也能工作,但地形会将第4个资源视为已终止的资源,并会在任何更新时尝试重新创建它,所以这不是很干净。
有什么建议吗?谢谢
编辑:
以下是一个不适用于远程exec的尝试来说明循环依赖性:
resource "aws_instance" "etcd" {
count = 3
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
subnet_id = module.vpc.public_subnets[count.index].id
provisioner "remote-exec" {
inline = [
"echo ${aws_instance.etcd[0].private_ip}",
"echo ${aws_instance.etcd[1].private_ip}",
"echo ${aws_instance.etcd[2].private_ip}"
]
}
}
基于注释。
您可以使用remoteexec在您的三个实例上运行代码,只有在所有实例都设置好之后才可以运行代码。您必须开发这样一个脚本,以便对它们三个进行ssh。
但是,您只能在第三个实例启动后调用remote-exec
脚本。这可以通过使用null_resoruce来实现,这将取决于实例。
在Provisioners Without a resource中介绍了这种使用null_resource的方法。