CBSDfile хуки: pre/post действия

Типы хуков

CBSDfile поддерживает функции-хуки, которые автоматически вызываются в определённые моменты жизненного цикла:

Хук Когда выполняется
globals() Перед обработкой любого окружения (общие переменные)
preup() Один раз, перед началом создания всех окружений
preup_<имя>() Перед созданием конкретного окружения <имя>
postcreate_<имя>() После создания окружения <имя>
postdestroy_<имя>() После удаления окружения <имя>
postup() Один раз, после обработки всех окружений

Порядок выполнения

  1. globals() — общие переменные
  2. preup() — глобальная подготовка
  3. Для каждого окружения:
  4. preup_<имя>() — специфичная подготовка
  5. Создание окружения
  6. postcreate_<имя>() — post-install настройка
  7. postup() — финализация

Примеры

Подключение общей конфигурации

preup()
{
    # Загрузить общий конфиг (например, IP-адреса из внешнего файла)
    . ../config
}

Файл ../config может содержать переменные:

REDIS_RO_IP="10.0.0.20"
REDIS_RW_IP="10.0.0.21"

Post-install настройка внутри jail

postcreate_web1()
{
    jexec jname=${jname} /bin/sh <<EOF
sysrc nginx_enable="YES"
sysrc php_fpm_enable="YES"
pkg install -y redis
service nginx start
EOF
}

Проверка зависимостей перед созданием

preup_redis1()
{
    # Убедиться, что base-jail существует
    if ! jstatus jname=base-jail > /dev/null 2>&1; then
        echo "Создаю base-jail..."
        jcreate jname=base-jail jprofile=base runasap=1
    fi
}

Post-create с копированием файлов

postcreate_app1()
{
    # Скопировать конфиги в jail
    jscp src=./configs/nginx.conf dest=/usr/local/etc/nginx/nginx.conf jname=${jname}

    # Скопировать скрипты
    jscp src=./scripts/setup.sh dest=/tmp/setup.sh jname=${jname}
    jexec jname=${jname} /bin/sh /tmp/setup.sh
}

Переменные внутри хуков

В теле хука доступны: - Все переменные из globals() и <тип>_<имя>() - $jname — имя текущего окружения - $rc — код возврата последней операции

Команды выполнения внутри окружений

Команда Описание
jexec jname=<имя> <команда> Выполнить команду внутри jail
jscp src=<путь> dest=<путь> jname=<имя> Копировать файл из хоста в jail
bexec <имя> <команда> Выполнить команду внутри bhyve VM (через SSH)
bscp <имя> <путь> <путь> Копировать файл из хоста в bhyve VM (через SSH)

Для bhyve VM команда bexec использует SSH. Параметр bhyve_ssh_wait (по умолчанию включён) ждёт стабилизации SSH-соединения перед выполнением.

Рекомендации

  • preup() — для глобальной подготовки и подгрузки общих конфигураций.
  • postcreate_<имя>() — для post-install настройки сервисов и установки пакетов.
  • preup_<имя>() — для проверки зависимостей и предварительной подготовки.
  • В postcreate используйте jexec/bexec для выполнения команд внутри окружения и jscp/bscp для копирования файлов.

Связанные страницы