Рабочее место 1С на Linux через WSL. Часть 8 - Автоматизация развертывания с помощью Bash
В предыдущих лабораторных работах мы детально, шаг за шагом, вручную собирали окружение для разработки и отладки 1С:Предприятия в среде WSL. Мы ставили СУБД, сервер 1С, необходимые библиотеки, шрифты и настраивали системные параметры. Однако ручная настройка - это долгий процесс, сопряженный с риском совершить ошибку (пропустить библиотеку, неверно указать права доступа или опечататься в конфигурационном файле). В условиях современной разработки (DevOps-практики, развертывание тестовых стендов, динамическое масштабирование) ключевым требованием становится воспроизводимость окружения. В этой лабораторной работе мы изучим принципы автоматизации развертывания рабочих мест программистов 1С на Linux. Мы напишем комплексный, отказоустойчивый параметризованный скрипт на языке Bash, который позволит развернуть и полностью подготовить к работе чистый сервер 1С и СУБД PostgreSQL одной командой.
Теоретическая часть
Почему Bash-скрипты? Хотя в современной ИТ-индустрии для управления конфигурациями часто используются тяжелые декларативные инструменты (такие как Ansible, Chef или Puppet), для локального окружения разработчика в WSL классический Bash остается самым быстрым, легковесным и универсальным решением. Скрипт выполняется непосредственно в операционной системе Linux, не требует установки дополнительных агентов и обеспечивает полный контроль над ходом выполнения команд. Особенности тихой (Non-interactive) установки Основная сложность при автоматизации установки программ через пакетный менеджер apt - это необходимость интерактивного взаимодействия с пользователем. Некоторые пакеты (например, ttf-mscorefonts-installer) в процессе установки выводят псевдографические диалоговые окна (EULA-лицензии), требующие нажатия клавиши Enter или выбора опции "Да/Нет". Для того чтобы скрипт мог выполняться полностью автоматически (в фоновом режиме "без головы"), используются следующие приемы:
- Переменная окружения DEBIAN_FRONTEND=noninteractive - сообщает пакетному менеджеру apt, что запросы к пользователю выводить не нужно, а следует использовать ответы по умолчанию.
- Утилита debconf-set-selections - позволяет предварительно "согласиться" с лицензионными соглашениями пакетов на уровне базы данных конфигурации debconf. Потоковое редактирование файлов через sed Автоматизация требует умения редактировать конфигурационные файлы скриптом. Вместо интерактивного редактора nano мы будем использовать неинтерактивный потоковый текстовый редактор sed (Stream Editor).
- С помощью sed можно находить строки по шаблону и заменять их.
- Например, раскомментировать и включить режим отладки сервера 1С можно следующей командой:
sudo sed -i 's/#SRV1CV8_DEBUG/SRV1CV8_DEBUG=1/g' /etc/init.d/srv1cv83
Ключ -i (in-place) указывает, что изменения нужно сохранить непосредственно в самом редактируемом файле. Безопасность и обработка ошибок в скриптах Качественный автоматизационный скрипт должен обладать свойством отказоустойчивости:
- Проверка прав суперпользователя (root): так как большинство системных команд требует sudo, скрипт должен сразу прекратить выполнение, если запущен от имени обычного пользователя без надлежащих привилегий.
- Режим остановки при ошибках (set -e): по умолчанию Bash продолжает выполнять скрипт, даже если одна из команд завершилась с ошибкой. Инструкция set -e заставляет скрипт немедленно аварийно завершиться при ошибке в любой строке.
- Защита от ложных успехов (False Success): скрипт должен анализировать коды возврата ключевых утилит и корректно логировать этапы работы.
Пошаговая инструкция
Шаг 1. Подготовка структуры каталогов в Windows и Linux
Для успешной работы скрипта автоустановки дистрибутивы СУБД PostgreSQL и платформы 1С должны находиться в предсказуемом месте.
- Убедитесь, что в Windows на диске C: создана папка C:\TMP_C, куда скачаны все необходимые дистрибутивы (пакеты сервера 1С, PostgreSQL и их зависимости).
- В терминале Linux создайте домашний каталог для дистрибутивов:
mkdir -p ~/DISTR
- Скрипт автоматизации будет самостоятельно забирать файлы из примонтированной папки Windows /mnt/c/TMP_C/ и копировать их в локальную директорию Linux для выполнения установки.
Шаг 2. Написание скрипта авторазвертывания deploy.sh
Создадим скрипт в вашем домашнем каталоге с помощью редактора nano:
nano ~/deploy.sh
Вставьте в файл следующее содержимое (внимательно изучите комментарии к коду): #!/bin/bash # ============================================================================== # Скрипт автоматического развертывания рабочего места 1С на Linux (WSL/Ubuntu) # ============================================================================== # Завершать скрипт немедленно при любой ошибке set -e # Определение цветов для логирования в терминале GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() {
echo -e "${GREEN}[INFO]$(date '+%Y-%m-%d %H:%M:%S')${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]$(date '+%Y-%m-%d %H:%M:%S')${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]$(date '+%Y-%m-%d %H:%M:%S')${NC} $1"
}
# 1. Проверка прав root (скрипт должен запускаться через sudo) if [ "$EUID" -ne 0 ]; then log_error "Скрипт должен быть запущен с правами суперпользователя (root). Используйте:
sudo ./deploy.sh"
exit 1
fi
# Получаем имя реального пользователя, который вызвал sudo REAL_USER=${SUDO_USER:-$USER} log_info "Инициализация развертывания. Имя пользователя в WSL: $REAL_USER" # Пути к источникам дистрибутивов WINDOWS_DISTR_DIR="/mnt/c/TMP_C" LOCAL_DISTR_DIR="/home/$REAL_USER/DISTR" # Проверка доступности папки Windows if [ ! -d "$WINDOWS_DISTR_DIR" ]; then log_error "Папка дистрибутивов Windows $WINDOWS_DISTR_DIR не найдена. Проверьте путь C:\\TMP_C."
exit 1
fi
# 2. Обновление пакетной базы log_info "Обновление пакетной базы apt..." apt-get update # 3. Настройка русской локали log_info "Проверка и генерация локали ru_RU.UTF-8..." if ! locale -a | grep -q "ru_RU.utf8"; then log_warn "Русская локаль не найдена. Установка пакета locales..."
apt-get install -y locales
locale-gen ru_RU.UTF-8
update-locale LANG=ru_RU.UTF-8
log_info "Локаль ru_RU.UTF-8 успешно сгенерирована." else log_info "Локаль ru_RU.UTF-8 уже присутствует в системе." fi # 4. Установка обязательных библиотек-зависимостей сервера 1С log_info "Установка обязательных графических и системных библиотек..." apt-get install -y \
libwebkitgtk-3.0-0 \
libMagickWand-6.Q16-3 \
libfontconfig1 \
libfreetype6 \
libgsf-1-common \
libglib2.0-0 \
unixodbc \
libkrb5-3 \
libgssapi-krb5-2
# 5. Автоматическая тихая установка шрифтов Microsoft Core Fonts log_info "Установка шрифтов TrueType Microsoft Core Fonts в тихом режиме..." # Предварительно соглашаемся с лицензионным соглашением Microsoft EULA
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true |
debconf-set-selections
# Запуск установки в неинтерактивном режиме DEBIAN_FRONTEND=noninteractive apt-get install -y ttf-mscorefonts-installer # Пересоздаем кэш шрифтов системы
fc-cache -fv
# 6. Подготовка папок и копирование дистрибутивов из Windows в Linux log_info "Копирование дистрибутивов из Windows..."
mkdir -p "$LOCAL_DISTR_DIR/1CSRV" "$LOCAL_DISTR_DIR/SQLDEP" "$LOCAL_DISTR_DIR/SQL"
chown -R "$REAL_USER:$REAL_USER" "/home/$REAL_USER/DISTR"
# Копируем архивы (с подавлением ошибок перезаписи) cp -f "$WINDOWS_DISTR_DIR"/deb64_*.tar.gz "$LOCAL_DISTR_DIR/1CSRV/" || log_warn "Архив сервера 1С не найден в C:\\TMP_C." cp -f "$WINDOWS_DISTR_DIR"/ubuntu_*.tar.gz "$LOCAL_DISTR_DIR/SQLDEP/" || log_warn "Архив зависимостей СУБД не найден в C:\\TMP_C." cp -f "$WINDOWS_DISTR_DIR"/postgresql_*.tar.bz2 "$LOCAL_DISTR_DIR/SQL/" || log_warn "Архив дистрибутива PostgreSQL не найден в C:\\TMP_C." # 7. Распаковка архива и установка зависимостей СУБД PostgreSQL log_info "Распаковка и установка системных зависимостей СУБД..."
cd "$LOCAL_DISTR_DIR/SQLDEP"
if ls ubuntu_*.tar.gz 1> /dev/null 2>&1; then
tar -xf ubuntu_*.tar.gz
# Установка deb-пакетов зависимостей из распакованной папки
cd ubuntu*x64/ || cd ubuntu*server.x64/
apt-get install -y ./*.deb
else
log_warn "Зависимости СУБД уже распакованы или архив отсутствует. Пропуск этапа." fi # 8. Распаковка архива и установка СУБД PostgreSQL от 1С log_info "Распаковка и установка СУБД PostgreSQL..."
cd "$LOCAL_DISTR_DIR/SQL"
if ls postgresql_*.tar.bz2 1> /dev/null 2>&1; then
tar -xf postgresql_*.tar.bz2
cd postgresql*deb/
apt-get install -y ./*.deb
else
log_warn "СУБД PostgreSQL уже распакована или архив отсутствует. Пропуск этапа." fi # Фиксация версий СУБД от случайного обновления из ванильных репозиториев log_info "Блокировка пакетов PostgreSQL от случайного обновления (apt-mark hold)..." apt-mark hold libpq5 postgresql-11 postgresql-client-11 || log_warn "Не удалось заблокировать версии СУБД." # 9. Распаковка архива и установка сервера 1С log_info "Распаковка и установка сервера 1С:Предприятие..."
cd "$LOCAL_DISTR_DIR/1CSRV"
if ls deb64_*.tar.gz 1> /dev/null 2>&1; then
tar -xf deb64_*.tar.gz
apt-get install -y \
./1c-enterprise83-common_*.deb \
./1c-enterprise83-server_*.deb \
./1c-enterprise83-ws_*.deb
else
log_warn "Архив сервера 1С отсутствует. Пропуск этапа." fi # 10. Настройка автозапуска служб без ввода пароля (Sudoers) log_info "Настройка прав беспарольного запуска служб для пользователя $REAL_USER..." SUDOERS_FILE="/etc/sudoers.d/wsl_1c_services"
echo "$REAL_USER ALL=(ALL) NOPASSWD: /usr/sbin/service postgresql *" > "$SUDOERS_FILE"
echo "$REAL_USER ALL=(ALL) NOPASSWD: /usr/sbin/service srv1cv83 *" >> "$SUDOERS_FILE"
chmod 0440 "$SUDOERS_FILE"
# 11. Настройка режима отладки сервера 1С через sed log_info "Активация режима отладки на сервере 1С (SRV1CV8_DEBUG=1)..." INIT_SCRIPT="/etc/init.d/srv1cv83" if [ -f "$INIT_SCRIPT" ]; then # Находим закомментированную строку и раскомментируем ее со значением 1
sed -i 's/#SRV1CV8_DEBUG/SRV1CV8_DEBUG=1/g' "$INIT_SCRIPT"
log_info "Режим отладки успешно прописан в конфигурационном скрипте сервера." else log_warn "Конфигурационный скрипт сервера 1С $INIT_SCRIPT не найден." fi # 12. Запуск служб и проверка их статуса log_info "Запуск СУБД PostgreSQL..." service postgresql start || log_warn "Не удалось запустить PostgreSQL." log_info "Запуск сервера 1С:Предприятие..." service srv1cv83 start || log_warn "Не удалось запустить сервер 1С." log_info "=== Развертывание успешно завершено! ===" log_info "Пожалуйста, задайте пароль системного пользователя postgres:" log_info "Команда: sudo passwd postgres" Сохраните файл (Ctrl + O, Enter) и закройте редактор nano (Ctrl + X).
Шаг 3. Запуск и права на исполнение
Чтобы скрипт мог быть выполнен операционной системой, ему необходимо явно предоставить права на исполнение:
chmod +x ~/deploy.sh
Теперь запустите скрипт с привилегиями суперпользователя:
sudo ~/deploy.sh
Наблюдайте за информационными сообщениями в терминале. Если скрипт отработает без ошибок - ваше окружение полностью установлено, настроено на отладку, добавлены права sudoers и запущены необходимые службы!
Практическое задание
Цель работы: Освоить базовые навыки автоматизации системного администрирования Linux-окружения для 1С, научиться писать отказоустойчивые скрипты и проверять результаты их работы. Задание:
- ☐ Создайте в домашнем каталоге скрипт авторазвертывания deploy.sh согласно пошаговому руководству.
- ☐ Модифицируйте скрипт так, чтобы он в самом конце автоматически выполнял проверку работоспособности установленных систем. Скрипт должен:
- Выполнить команду pg_isready для проверки доступности СУБД PostgreSQL.
- Выполнить команду ps aux | grep ragent и вывести сообщение, запущен ли сервер 1С.
- ☐ Добавьте в скрипт проверку версии установленной платформы. Если версия платформы в репозитории не соответствует ожидаемой (например, скрипт ориентирован строго на ветку 8.3.16), выводите предупреждающее сообщение в консоль.
- ☐ Сделайте скриншот успешного завершения работы скрипта и проверьте процессы в диспетчере задач Windows.
Проверьте себя
- Зачем в Bash-скрипте в самом начале объявляется инструкция set -e? Ответ: Эта инструкция включает режим немедленного завершения скрипта при ошибке в любой из команд (если команда возвращает ненулевой код выхода). Без этого флага скрипт продолжит выполнять последующие шаги даже после критического сбоя на этапе установки или копирования.
- Как в автоматическом режиме обойти лицензионные предупреждения EULA-соглашений при установке пакета ttf-mscorefonts-installer через apt? Ответ: Необходимо предварительно импортировать выбор согласия в базу данных debconf с помощью команды:
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true |
debconf-set-selections
и затем запустить установку с переменной DEBIAN_FRONTEND=noninteractive.
- Что делает команда sed -i 's/#SRV1CV8_DEBUG/SRV1CV8_DEBUG=1/g' /etc/init.d/srv1cv83? Ответ: Она выполняет потоковую замену в текстовом файле /etc/init.d/srv1cv83: находит закомментированную переменную отладки #SRV1CV8_DEBUG и заменяет ее на активную строку конфигурации SRV1CV8_DEBUG=1. Флаг -i сохраняет изменения прямо в исходном файле, без создания резервных копий или вывода в консоль.
- Почему вместо редактирования основного файла /etc/sudoers в скрипте рекомендуется создавать файл в каталоге /etc/sudoers.d/? Ответ: Прямое редактирование /etc/sudoers скриптом небезопасно: любая синтаксическая ошибка может полностью заблокировать доступ к sudo для всех пользователей. Использование изолированного файла в /etc/sudoers.d/ позволяет легко управлять конфигурацией, безопасно удалять права при необходимости и минимизирует риски повреждения основного системного файла.
- Каким образом скрипт может динамически определить имя пользователя, запустившего его через sudo, для корректного прописывания прав в файлы конфигурации? Ответ: Для этого используется системная переменная окружения $SUDO_USER. Если скрипт запущен через sudo, в этой переменной хранится имя исходного (реального) пользователя (например, pen), в то время как переменная $USER переопределяется на root.
Попробовать НОПик →
Проверить свой уровень бесплатно →