LINUX.ORG.RU

Постепенное пересоздание ресурсов в terraform

 


1

1

Имеется ресурс с параметром count. Например

resource "openstack_compute_instance_v2" "worker" {
  count       = var.worker_count
  name        = "worker-${count.index + 1}"
  flavor_name = data.openstack_compute_flavor_v2.worker.name
  user_data   = templatefile("${path.module}/cloud-init/config.yaml.tftpl", { ... })

count больше единицы.

Если я поменяю значение flavor_name или user_data, то все серверы разом будут пересозданы. Это недопустимо. Нужно это делать по одному, мониторя состояние остальных серверов. Не получилось придумать, как это можно сделать адекватно. Пока пришел в голову только один способ:

resource "openstack_compute_instance_v2" "worker" {
  count       = var.worker_count
  name        = "worker-${count.index + 1}"
  flavor_name = count.index < var.worker_new_count ? new_worker_name : worker_name;
  user_data   = count.index < var.worker_new_count ? new_user_data : user_data;

продублировать все поля с новыми значениями и меняя переменную var.worker_new_count постепенно пересоздать все ресурсы, начиная с первого. Но будет довольно много дублирования, что кажется не совсем удачным вариантом.

В идеале хотелось бы написать

resource "openstack_compute_instance_v2" "worker" {
  lifecycle {
    ignore_changes = count.index < var.worker_new_count ? [] : [all]
  }
  count       = var.worker_count
  name        = "worker-${count.index + 1}"
  flavor_name = data.openstack_compute_flavor_v2.worker.name
  user_data   = templatefile("${path.module}/cloud-init/config.yaml.tftpl", { ... })

но в этом поле нельзя писать выражения.

★★★★
Ответ на: комментарий от Demacr

Не, это не то, он просто всё создаёт последовательно, а не параллельно, всё равно за один раз всё создаётся.

vbr ★★★★
() автор топика
Ответ на: комментарий от Demacr

Мне надо, чтобы я запустил и оно один ресурс пересоздало, например нулевой. А остальные пока не трогало. Потом я через полчаса запустил ещё раз, указав, что теперь надо первый пересоздать, оно первый пересоздало, остальные не трогая. И так далее.

vbr ★★★★
() автор топика
Ответ на: комментарий от vbr

Выше я указал что тебе нужно юзать -target. Прям то, что нужно. Сам его использую когда нужно только часть из обновленного обновить/заменить.

Demacr ★★
()
Последнее исправление: Demacr (всего исправлений: 1)
Ответ на: комментарий от Demacr

Похоже, то, что нужно, премного благодарен. Интересно, почему этой опции нет в terraform -help apply.

vbr ★★★★
() автор топика
Ответ на: комментарий от vbr

Потому что оно появляется только для apply или plan. Через автокомплишен оно есть.

Demacr ★★
()
Ответ на: комментарий от vbr
-target            -- (resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.
Demacr ★★
()
Ответ на: комментарий от Demacr

Ага, уже проверил, работает как положено, спасибо ещё раз. А я тут конфигурации городил адские.

vbr ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.