我有一个terraform脚本,我在其中启动一个ec2实例集群并将它们组合在一起(特别是为Influx Db)。以下是该脚本的相关部分:
resource "aws_instance" "influxdata" {
count = "${var.ec2-count-influx-data}"
ami = "${module.amis.rhel73_id}"
instance_type = "${var.ec2-type-influx-data}"
vpc_security_group_ids = ["${var.sg-ids}"]
subnet_id = "${element(module.infra.subnet,count.index)}"
key_name = "${var.KeyName}"
tags {
Name = "influx-data-node"
System = "${module.infra.System}"
Environment = "${module.infra.Environment}"
OwnerContact = "${module.infra.OwnerContact}"
Owner = "${var.Owner}"
}
ebs_block_device {
device_name = "/dev/sdg"
volume_size = 750
volume_type = "io1"
iops = 3000
encrypted = true
delete_on_termination = false
}
user_data = "${file("terraform/attach_ebs.sh")}"
connection {
//private_key = "${file("/Users/key_CD.pem")}" #dev env
//private_key = "${file("/Users/influx.pem")}" #qa env west
private_key = "${file("/Users/influx_east.pem")}" #qa env east
user = "ec2-user"
}
provisioner "remote-exec" {
inline = ["echo just checking for ssh. ttyl. bye."]
}
}
我现在要做的是...污点一个实例然后让terraform重建它但是...我想要它做的是卸载ebs,分离ebs,重建实例,附加ebs,登上ebs。
当我执行terraform taint module=instance
时,它会对它进行污染,然后当我去应用更改时,它会创建一个全新的实例和新的ebs卷,而不是将新的实例重新连接到新实例上。
我也有一些数据丢失,因为这是集群的一部分,因此当节点重建时......它应该只与其他节点同步....
如何用Terraform做到这一点?
答案 0 :(得分:0)
创建要污染的实例的快照。然后更改ec2资源的ebs卷以获得上一个快照的快照ID参数。 https://www.terraform.io/docs/providers/aws/r/instance.html#snapshot_id
答案 1 :(得分:0)
由于您不关心数据丢失,我想要认为ec2实例与重建之前处于相同状态但没有数据是可以的。
如果是这种情况,我将使用用户数据在重建后自动挂载新连接的卷。在这种情况下,在重建之后,ec2实例将处于相同的状态(卷格式化和附加)并准备好与群集中的其他节点同步以获取数据,而无需任何额外的工作。该脚本应如下所示:
#!/bin/bash
DEVICE_FS=`blkid -o value -s TYPE /dev/xvdh`
if [ "`echo -n $DEVICE_FS`" == "" ] ; then
mkfs.ext4 /dev/xvdh
fi
mkdir -p /data
echo '/dev/xvdh /data ext4 defaults 0 0' >> /etc/fstab
mount /data