#!/bin/bash # ============================================================ # ЗАДАНИЕ 2. Настройка HQ-SRV (Linux / РЕД ОС 8) # 2. RAID0 из двух дисков по 1 ГБ: md0, ext4, авто-монтирование /raid # 3. NFS: /raid/nfs, rw только для сети HQ-CLI; отчёт # 4. chrony-клиент (сервер ISP) # 7. Веб-приложение: apache + mariadb, файлы из Additional.iso # ============================================================ # --- Проверка прав root --- if [[ $EUID -ne 0 ]]; then echo "Запустите скрипт с правами root (sudo bash hq-srv.sh)" exit 1 fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= EXAM_TZ="Europe/Moscow" # проверить на экзамене ISO_DIR="/mnt/iso" # точка монтирования Additional.iso # --- 2. RAID0 --- RAID_DEV1="" # первый диск 1 ГБ (пример: /dev/vdb) RAID_DEV2="" # второй диск 1 ГБ (пример: /dev/vdc) RAID_NAME="md0" # имя устройства по заданию MDADM_CONF="/etc/mdadm.conf" # по заданию; ПРОВЕРИТЬ имя файла на РЕД ОС 8 RAID_MOUNT="/raid" FSTAB="/etc/fstab" # --- 3. NFS --- NFS_PACKAGE="nfs-utils" # ПРОВЕРИТЬ: пакет NFS-сервера на РЕД ОС 8 NFS_SERVICE="nfs-server" NFS_EXPORT="/raid/nfs" NFS_NET="" # сеть HQ-CLI, формат адрес/префикс — доступ только ей # --- 4. chrony-клиент --- CHRONY_CONF="/etc/chrony.conf" # ПРОВЕРИТЬ путь конфига chrony CHRONY_PACKAGE="chrony" CHRONY_SERVICE="chronyd" NTP_SERVER="" # адрес ISP (без префикса) # --- 7. Веб-приложение --- APACHE_PACKAGE="httpd" # ПРОВЕРИТЬ: пакет apache на РЕД ОС 8 APACHE_SERVICE="httpd" MARIADB_PACKAGE="mariadb-server" MARIADB_SERVICE="mariadb" WEB_ROOT="/var/www/html" # корневой каталог сайта WEB_DB_NAME="webdb" # название БД по заданию WEB_DB_USER="web" # пользователь БД по заданию WEB_DB_PASS="P@ssw0rd" # пароль пользователя БД по заданию ISO_WEB_DIR="$ISO_DIR/web" # директория приложения в образе (файлы: dump.sql, # index.php, logo.png — содержание НЕ известно заранее) WEB_DB_HOST="localhost" # хост подключения для index.php (уточнить по файлам задания) APACHE_EXTERNAL_PORT="80" # порт apache по заданию (наружу пробрасывается 8080) # ============ Проверка заполнения переменных ============ MISSING=() for NAME in RAID_DEV1 RAID_DEV2 NFS_NET NTP_SERVER EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi echo "=== Настройка HQ-SRV, задание 2 ===" # --- 1. RAID0 (md0) из двух дисков --- echo "--- RAID0 (mdadm) ---" dnf install -y mdadm || echo "ПРОВЕРИТЬ: пакет mdadm не установился" if mdadm --detail /dev/$RAID_NAME >/dev/null 2>&1; then echo "Массив /dev/$RAID_NAME уже существует" else mdadm --create /dev/$RAID_NAME --level=0 --raid-devices=2 \ "$RAID_DEV1" "$RAID_DEV2" --run fi mdadm --detail /dev/$RAID_NAME || echo "ПРОВЕРИТЬ: массив не собрался" # Конфигурация массива в файл (строку ARRAY добавляем только если её нет) if ! grep -q "^ARRAY /dev/$RAID_NAME" "$MDADM_CONF" 2>/dev/null; then mdadm --detail /dev/$RAID_NAME | grep -E "^(UUID)" >> "$MDADM_CONF" echo "ARRAY /dev/$RAID_NAME UUID=$(mdadm -D /dev/$RAID_NAME | awk '/^UUID/ {print $3}')" >> "$MDADM_CONF" chmod 644 "$MDADM_CONF" fi if command -v dracut >/dev/null 2>&1; then dracut -f || echo "ПРОВЕРИТЬ: не удалось собрать initramfs" fi # --- 2. ext4 и автопримонтирование /raid --- echo "--- Файловая система и монтирование $RAID_MOUNT ---" # Повторный запуск не должен перезаписывать ext4: проверяем по blkid if blkid /dev/$RAID_NAME | grep -q "TYPE=\"ext4\""; then echo "Файловая система ext4 уже создана" else mkfs.ext4 /dev/$RAID_NAME fi mkdir -p "$RAID_MOUNT" RAID_UUID=$(blkid -s UUID -o value /dev/$RAID_NAME) if mountpoint -q "$RAID_MOUNT"; then echo "Монтируется: $RAID_MOUNT уже смонтирована" else if ! grep -q "^UUID=$RAID_UUID $RAID_MOUNT" "$FSTAB"; then echo "UUID=$RAID_UUID $RAID_MOUNT ext4 defaults 0 0" >> "$FSTAB" fi mount -a fi df -h "$RAID_MOUNT" # --- 3. NFS: экспорт /raid/nfs только для сети HQ-CLI --- echo "--- NFS ---" dnf install -y "$NFS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $NFS_PACKAGE не установился" mkdir -p "$NFS_EXPORT" # Доступ всё равно ограничен в exports только сетью HQ-CLI if ! grep -E "^$NFS_EXPORT " /etc/exports 2>/dev/null | grep -q "$NFS_NET"; then echo "$NFS_EXPORT $NFS_NET(rw,sync,subtree_check)" >> /etc/exports echo "Добавлен экспорт: $NFS_EXPORT для $NFS_NET" fi exportfs -ra || { echo "Ошибка exportfs:"; exportfs -v; } systemctl enable --now "$NFS_SERVICE" \ || { echo "ПРОВЕРИТЬ: служба $NFS_SERVICE не запустилась"; systemctl status "$NFS_SERVICE" --no-pager; } echo "Основные параметры сервера для отчёта:" exportfs -v # --- 4. chrony-клиент (сервер = ISP) --- echo "--- chrony-клиент ($NTP_SERVER) ---" dnf install -y "$CHRONY_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CHRONY_PACKAGE не установился" if ! grep -qE "^server[[:space:]]+$NTP_SERVER\\b" "$CHRONY_CONF" 2>/dev/null; then sed -i "1i server $NTP_SERVER iburst" "$CHRONY_CONF" echo "Добавлено: server $NTP_SERVER iburst" fi systemctl enable --now "$CHRONY_SERVICE" \ || { echo "ПРОВЕРИТЬ: служба $CHRONY_SERVICE не запустилась"; systemctl status "$CHRONY_SERVICE" --no-pager; } # --- 5. Веб-приложение: apache + mariadb + файлы из Additional.iso --- echo "--- Веб-приложение (apache + mariadb) ---" if [[ ! -d "$ISO_WEB_DIR" ]]; then echo "ДЕЛАЕТСЯ ВРУЧНУЮ: директории $ISO_WEB_DIR нет — смонтируйте Additional.iso в $ISO_DIR" echo " mount -o loop /путь/к/образу/Additional.iso $ISO_DIR" else ls -l "$ISO_WEB_DIR" fi dnf install -y "$APACHE_PACKAGE" "$MARIADB_PACKAGE" || echo "ПРОВЕРИТЬ: пакеты apache/mariadb не установились" systemctl enable --now "$MARIADB_SERVICE" "$APACHE_SERVICE" \ || echo "ПРОВЕРИТЬ: службы $MARIADB_SERVICE/$APACHE_SERVICE не запустились" # Импорт дампа в webdb и создание пользователя web (права на webdb) mysql -e "CREATE DATABASE IF NOT EXISTS $WEB_DB_NAME CHARACTER SET utf8;" mysql -e "CREATE USER IF NOT EXISTS '$WEB_DB_USER'@'$WEB_DB_HOST' IDENTIFIED BY '$WEB_DB_PASS';" mysql -e "GRANT ALL PRIVILEGES ON $WEB_DB_NAME.* TO '$WEB_DB_USER'@'$WEB_DB_HOST'; FLUSH PRIVILEGES;" if [[ -f "$ISO_WEB_DIR/dump.sql" ]]; then mysql "$WEB_DB_NAME" < "$ISO_WEB_DIR/dump.sql" echo "Дамп импортирован: $ISO_WEB_DIR/dump.sql -> $WEB_DB_NAME" else echo "ДЕЛАЕТСЯ ВРУЧНУЮ: dump.sql не найден в $ISO_WEB_DIR" fi mysql -e "SHOW TABLES FROM $WEB_DB_NAME; SELECT User,Host FROM mysql.user WHERE User='$WEB_DB_USER';" # Копируем файлы приложения в корневой каталог сайта if [[ -f "$ISO_WEB_DIR/index.php" ]]; then cp -f "$ISO_WEB_DIR/index.php" "$WEB_ROOT/" else echo "ДЕЛАЕТСЯ ВРУЧНУЮ: index.php не найден в $ISO_WEB_DIR" fi if [[ -f "$ISO_WEB_DIR/logo.png" ]]; then cp -f "$ISO_WEB_DIR/logo.png" "$WEB_ROOT/" else echo "ДЕЛАЕТСЯ ВРУЧНУЮ: logo.png не найден в $ISO_WEB_DIR" fi chown -R apache:apache "$WEB_ROOT" 2>/dev/null \ || echo "ПРОВЕРИТЬ: пользователь службы apache на РЕД ОС 8 (может быть httpd)" # Данные для подключения БД в index.php — проверить как выглядит файл, # поправить вручную при необходимости (пример для sed): # sed -i "s/DB_HOST.*/'${WEB_DB_HOST}',/" $WEB_ROOT/index.php (формат может отличаться) echo "ПРОВЕРИТЬ: в $WEB_ROOT/index.php укажите вручную учётные данные БД:" echo " хост $WEB_DB_HOST, база $WEB_DB_NAME, пользователь $WEB_DB_USER, пароль $WEB_DB_PASS" # --- 6. Часовой пояс --- timedatectl set-timezone "$EXAM_TZ" echo "" echo "=== Самопроверка на HQ-SRV ===" echo "Массив и смонтированный RAID:" lsblk /dev/$RAID_DEV1 /dev/$RAID_DEV2 /dev/$RAID_NAME 2>/dev/null df -h "$RAID_MOUNT" echo "" echo "Экспорт NFS:" exportfs -v echo "" echo " chronyc sources" chronyc sources 2>/dev/null echo "" echo "Дополнительные проверки вручную:" echo " mysql -u$WEB_DB_USER -p$WEB_DB_PASS -e 'USE $WEB_DB_NAME; SHOW TABLES;'" echo " curl -I http://127.0.0.1:$APACHE_EXTERNAL_PORT (страница веб-приложения?)" echo " с HQ-CLI: showmount -e <адрес HQ-SRV> (список экспортов NFS)"