Удаление

Удалять можно двумя способами — и важно не перепутать, где выполняется команда.

На самом сервере, из распакованной поставки:

bash era/scripts/uninstall.sh

Со своей машины по ssh — тогда поставка сначала копируется на сервер, а вопросы задаёт он:

bash uninstall_ssh.sh --host=192.168.0.10 --user=user

Разница видна сразу: обёртка начинает с вопросов о подключении — адрес, порт, пользователь, ключ. Если вы этих вопросов не ждали, значит запущена обёртка вместо era/scripts/uninstall.sh; и наоборот, era/scripts/uninstall.sh про ssh не спрашивает никогда.

Удаление устроено так же, как установка: сначала опрос, потом показ того, что будет удалено, и только потом само удаление.

План удаления показывает, что найдено

Экран называется «Проверьте параметры удаления», и вопросы на нём — об уже установленном, а не о том, что ставить. Про базу спрашивается «Как установлен PostgreSQL?»: от ответа зависит, что удалять — контейнер postgres<постфикс> или кластер systemd с каталогом данных. Если не уверены, docker ps покажет контейнер, а systemctl list-units postgresql* — кластер.

Отличие от установки: в плане у каждого пункта отмечено, существует ли объект на самом деле, а у каталогов — сколько они занимают.

Будет выполнено на 192.168.0.10:
   1. Остановить и удалить контейнер era_11                  [найден]
   2. Удалить контейнер postgres_11                          [не найден]
   3. Размонтировать 3 точки внутри /opt/era_11
   4. Удалить каталог /opt/era_11                            [найден, 4.2G]

Это единственная защита от опечатки в имени: контейнер, помеченный «не найден», скорее всего назван не так, как вы думаете.

Что удаляется

Что Когда

Контейнер платформы

Всегда, если найден.

Контейнер PostgreSQL

При --douninstallpg=y и --pgmode=d.

Юнит systemd кластера

При --douninstallpg=y и --pgmode=h.

Каталог кластера

При --douninstallpg=y.

Каталог инстанса

Всегда.

Пакеты PostgreSQL

Только при --douninstallsyspkgs=y.

Не удаляются никогда: docker, образы, параметры ядра, правила firewalld и записи в /etc/exports.d. Это общие для сервера настройки, и снимать их за вас установщик не берётся.

Монтирования

Перед удалением каталога инстанса установщик размонтирует всё, что внутри него смонтировано. Порядок важен: rm -rf по смонтированному каталогу NFS удалял бы данные на сервере, а не локальные.

Если размонтировать не удалось, удаление каталога не выполняется, и об этом сообщается явно.

Что осталось на сервере

В конце удаления печатается форма — та же, что после установки, но отвечает она на вопрос «что осталось»:

== Что осталось на сервере ==

  [ ok ] Контейнер платформы                удалён: era&lt;постфикс&gt;
  [ ok ] PostgreSQL                         удалён
  [warn] Монтирования                       осталось: /opt/era&lt;постфикс&gt;/era_recpath
  [ ok ] Каталог инстанса                   удалён: /opt/era&lt;постфикс&gt;

Проверяется состояние системы, а не код возврата команд: контейнера нет, служба снята вместе с юнитом, каталог кластера и каталог инстанса исчезли, монтирований не осталось. Оставшаяся точка монтирования — предупреждение, а не отказ: занятую точку удаление снимает лениво, и ядро отпустит её, когда последний процесс закроет файлы. Оставшийся контейнер или каталог — отказ, и установщик завершается с кодом 5.

При --dry-run формы нет: сервер не менялся.

Защита от опасного пути

Каждое удаление каталога проходит общую проверку:

  • путь должен быть абсолютным;

  • длина — не меньше восьми символов;

  • пустое значение не удаляет ничего, а выводит предупреждение.

Так --erainstancedatapath= с потерянным значением не превращается в rm -rf /.

Примеры

Спросить, что удалять:

bash era/scripts/uninstall.sh

Удалить платформу вместе с базой в контейнере:

bash era/scripts/uninstall.sh --non-interactive \
     --datapath=/opt --eracontainername=era_11 \
     --douninstallpg=y --pgcontainername=postgres_11 --pgmode=d

Посмотреть, что будет удалено, и выйти (на самом сервере, из каталога поставки):

cd /tmp/era_installer
bash era/scripts/uninstall.sh --dry-run --eracontainername=era_11

То же со своей машины:

bash uninstall_ssh.sh --dry-run --host=192.168.0.10 --user=user --eracontainername=era_11

--dry-run относится к целевому хосту, а не к обёртке: план — что именно будет удалено, с отметками найдено/не найдено — строит сам сервер, и показать его может только он. Поэтому обёртка свою работу делает по-настоящему: копирует поставку в /tmp/era_installer и запускает там удаление с тем же ключом. Сервер при этом не изменяется; поставка остаётся в /tmp и исчезает при перезагрузке.

Команда удаления именно этого сервера печатается в конце успешной установки — её удобно сохранить сразу.

Инстансы, поставленные третьей версией

Удаляются этой же командой. Имена контейнеров, каталогов и юнитов systemd в четвёртой версии не менялись, поэтому она находит то, что поставила предыдущая.