194 lines
9.9 KiB
Bash
194 lines
9.9 KiB
Bash
#!/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)"
|