#terraform #terraform-provider-openstack
#terraform #terraform-provider-openstack
Вопрос:
Я работаю с terraform и openstack и использую постоянный том для хранения данных. При воссоздании только сервера и повторном подключении того же тома эти данные иногда повреждаются / теряются. Как мне предотвратить это?
Я заражаю сервер, а затем применяю terraform для воссоздания. Это отсоединяет том, уничтожает сервер, воссоздает и присоединяет том обратно. Однако иногда данные в томе теряются или повреждаются. Этот том содержит файлы базы данных 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}"
}
Ожидаемый результат заключается в том, что данные тома не теряются, и когда я подключаюсь обратно к недавно воссозданному серверу, файловые системы в этом томе и все данные находятся там.
Спасибо. Цените любую информацию о том, как это сделать.
Ответ №1:
Быстрый способ — разделить код на два стека, один стек (модуль № 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}"
Комментарии:
1. Это не отвечает на вопрос. Хотя им следует рассмотреть возможность разделения своего кода Terraform, чтобы упростить замену экземпляра, а не хранилища, это не то, с чем они борются.
2. после разделения вы можете запускать модуль # 2 в любое время, что бы ни применялось или уничтожалось
3. основная проблема для меня заключается в том, что данные отсутствуют после воссоздания экземпляра. У меня есть 3 раздела на томе, но после повторного подключения иногда они есть, иногда они отсутствуют.. иногда они есть, но повреждены. я продолжаю тестирование — и если я остановлю экземпляр и отсоединю том с помощью команд openstack, прежде чем я уничтожу экземпляр и создам заново, мои данные будут там после повторного подключения тома. Я не могу быть уверен на 100% без дополнительного тестирования. Я пытаюсь избежать этого, хотя — поскольку предпочел бы, чтобы terraform запускал все это
Ответ №2:
Это работает, когда я размонтирую файловые системы в vol перед использованием terraform для воссоздания экземпляра. Я думал, что stop_before_destroy = «true» изящно остановил бы экземпляр и отсоединил vol, но в моем случае это не сработало 🙂