Как предотвратить потерю данных в постоянном томе при воссоздании сервера - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю с terraform и openstack и использую постоянный том для хранения данных. При воссоздании только сервера и повторном подключении того же объема эти данные иногда оказываются поврежденными / потерянными. Как мне это предотвратить?

Я портю сервер и затем терраформ применяюсь для воссоздания. Это отсоединяет том, уничтожает сервер, воссоздает и присоединяет обратно том. Тем не менее, иногда данные в томе теряются или повреждены. Этот том содержит файлы базы данных postgreSQL.

Я пытался использовать terraform destroy - но это также приведет к разрушению тома.

Это модуль

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"
}

Это main.tf

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}"
}

Ожидаемый результат: данные тома не теряются, и когда я подключаюсь к вновь созданному серверу, файловые системы этого тома и все данные находятся там.

Спасибо. Цените любые идеи о том, как это сделать.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Это работает, когда я размонтирую файловые системы в vol перед использованием terraform для воссоздания экземпляра. Я думал, что stop_before_destroy = "true" изящно остановит экземпляр и отсоединит vol, но в моем случае это не сработало :)

0 голосов
/ 09 апреля 2019

Быстрый способ - разделить код на два стека, один стек (модуль # 1) управляет только хранилищем, другой (модуль # 2) управляет остальными.

После разделения вы можете изменить модуль# 2 в любое время, что бы ни применялось или уничтожало.

Между двумя стеками вы можете ссылаться на ресурс хранилища несколькими способами.

Первый способ:

ссылка из источника данных terraform_remote_state , который необходимо установитьвывод, как показано ниже

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_remote_state.persistent_storage.persistent_storage_id}"

Второй способ:

ссылка на идентификатор постоянного хранилища с источником данных openstack_blockstorage_availability_zones_v3 напрямую

третий путь:

путь # 3 аналогичен # 1,

необходимо вывести значение "${openstack_blockstorage_volume_v2.pgvol.id}" в модуле # 1,

output "persistant_storage_id" {
  value = "${openstack_blockstorage_volume_v2.pgvol.id}"
}

вызвать модуль # 1

module "persistent_storage" {
   ...
}

, а затем указать его как ${module.persistent_storage.persistent_storage_id}"

...