net/zadanie2/hq-srv.sh

208 lines
11 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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="Asia/Yekaterinburg" # по заданию — Екатеринбург
ISO_DIR="/mnt/iso" # точка монтирования Additional.iso
# --- 2. RAID0 ---
RAID_DEV1="" # пусто = автоопределение: два диска до ~1.3 ГБ (не системный)
RAID_DEV2="" # можно задать вручную (пример: /dev/vdb, /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 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) ---"
# Автоопределение двух дисков ~1 ГБ (небольшие блочные устройства; системный
# диск всегда больше, поэтому фильтр по размеру до 1.3 ГБ безопасен)
if [[ -z "$RAID_DEV1" || -z "$RAID_DEV2" ]]; then
mapfile -t _DISKS < <(lsblk -dn -o NAME,SIZE -b 2>/dev/null \
| awk -v max=$((13*1024*1024*1024)) '$2<max {print "/dev/"$1}' | head -2) || true
if [[ ${#_DISKS[@]} -eq 2 && -b "${_DISKS[0]}" && -b "${_DISKS[1]}" ]]; then
RAID_DEV1="${_DISKS[0]}"; RAID_DEV2="${_DISKS[1]}"
echo "Найдены диски 1 ГБ: $RAID_DEV1 $RAID_DEV2"
else
echo "Автоопределение не сработало — задайте RAID_DEV1/RAID_DEV2 вручную. Диски:"
lsblk -dn -o NAME,SIZE,TYPE
exit 1
fi
fi
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)"