Terraform 如何在重新创建服务器时防止永久卷中的数据丢失
我正在使用terraform和openstack,并使用一个持久卷来存储数据。仅重新创建服务器并重新连接同一卷时,此数据有时会损坏/丢失。我如何防止这种情况 我污染了服务器,然后terraform应用程序重新创建。这将分离卷、销毁服务器、重新创建并重新连接卷。但是,有时卷中的数据会丢失或损坏。此卷包含postgreSQL数据库文件 我尝试使用terraform destroy,但这也会导致卷被销毁 这是模块Terraform 如何在重新创建服务器时防止永久卷中的数据丢失,terraform,terraform-provider-openstack,Terraform,Terraform Provider Openstack,我正在使用terraform和openstack,并使用一个持久卷来存储数据。仅重新创建服务器并重新连接同一卷时,此数据有时会损坏/丢失。我如何防止这种情况 我污染了服务器,然后terraform应用程序重新创建。这将分离卷、销毁服务器、重新创建并重新连接卷。但是,有时卷中的数据会丢失或损坏。此卷包含postgreSQL数据库文件 我尝试使用terraform destroy,但这也会导致卷被销毁 这是模块 data "template_file" "init-config" { templ
data "template_file" "init-config" {
template = "${file("modules/postgres-server/init-config.tpl")}"
vars {
instance_name = "${var.instance_name}"
tenant_name = "${var.tenant_name}"
}
}
# Define instance properties.
# You should provide the variables in main.tf
resource "openstack_compute_instance_v2" "server" {
name = "${var.instance_name}"
image_name = "${var.image_name}"
flavor_name = "${var.flavor_name}"
key_pair = "${var.key_name}"
security_groups = ["default", "${var.secgroup_name}"]
user_data = "${data.template_file.init-config.rendered}"
stop_before_destroy = "true"
network {
name = "${var.tenant_name}-net"
}
}
# Define a floating ip resoruce
resource "openstack_networking_floatingip_v2" "server_float" {
pool = "net-iaas-external-dev"
}
# Associate the instance and floating ip resources
resource "openstack_compute_floatingip_associate_v2" "server_float_assoc" {
floating_ip = "${openstack_networking_floatingip_v2.server_float.address}"
instance_id = "${openstack_compute_instance_v2.server.id}"
}
# Create persistent vol
resource "openstack_blockstorage_volume_v2" "pgvol" {
name = "postgreSQL-DATA-${var.instance_name}"
description = "Data Vol for ${var.instance_name}"
size = 50
}
# Attach the persistent data to the instance
resource "openstack_compute_volume_attach_v2" "pgvol_attach" {
instance_id = "${openstack_compute_instance_v2.server.id}"
volume_id = "${openstack_blockstorage_volume_v2.pgvol.id}"
device = "/dev/vdc"
}
这是主要的
module "postgre-server" {
source = "./modules/postgres-server"
instance_name = "INST_NAME"
image_name = "centos7"
flavor_name = "r1.medium"
key_name = "${module.keypair.output_key_name}"
secgroup_name = "${module.secgroup.output_secgroup_name}"
tenant_name = "${var.tenant_name}"
}
预期的结果是卷数据不会丢失,当我连接回新重新创建的服务器时,卷中的文件系统和所有数据都在那里
谢谢。感谢您对如何执行此操作的任何见解。一种快速方法是将代码分成两个堆栈,一个堆栈(模块1)只管理存储,另一个(模块2)管理其余 拆分后,您可以随时更改模块#2,无论应用或销毁什么 在两个堆栈之间,可以通过多种方式引用存储资源 方法一: 来自数据源的引用,您需要如下设置输出
output "persistant_storage_id" {
value = "${openstack_blockstorage_volume_v2.pgvol.id}"
}
然后使用模块2中的以下代码引用持久存储
data "terraform_remote_state" "persistent_storage" {
backend = "xxx"
config {
name = "hashicorp/persistent-storage"
}
}
因此,模块2可以将其引用为${data.terraform\u remote\u state.persistent\u storage.persistent\u storage\u id}“
方式二:
直接使用数据源引用持久存储卷id
方式三:
道路3与道路1相似
您需要在模块#1中输出值“${openstack\u blockstorage\u volume\u v2.pgvol.id}”
调用模块#1
然后将其引用为
${module.persistent\u storage.persistent\u storage\u id}“
在使用terraform重新创建实例之前,当我卸载vol中的文件系统时,这会起作用。我原以为stop\u before\u destroy=“true”会优雅地停止实例并分离vol,但在我的情况下它不起作用:)这并不能回答问题。虽然他们应该考虑拆分他们的TRARAFILE代码,使它更简单地替换实例而不是它们所挣扎的存储。在分裂之后,可以随时运行在模块2上,无论应用或销毁,主要问题是在重新创建实例之后数据丢失。我在vol上有3个分区,但是在重新连接之后,有时它们在那里,有时它们丢失了。。有时,他们在那里,但腐败。我已经做了进一步的测试——如果我在销毁实例并重新创建之前停止实例并使用openstack命令分离vol,那么在重新连接vol之后,我的数据就在那里。如果没有更多的测试,我无法100%确定。不过我尽量避免这种情况——因为我更愿意让terraform运行所有这些
output "persistant_storage_id" {
value = "${openstack_blockstorage_volume_v2.pgvol.id}"
}
module "persistent_storage" {
...
}