Автоматизация Linux-систем: эффективные bash-скрипты для задач

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Системные администраторы
  • Разработчики, работающие с Linux
  • ИТ-специалисты, желающие повысить продуктивность через автоматизацию

    Если вы хоть раз просыпались в холодном поту от мысли о предстоящем дне, наполненном монотонными задачами в Linux-системах, этот материал — ваш спасательный круг. Bash-скрипты — мощнейший инструмент, превращающий часы утомительного щелканья по клавиатуре в секунды автоматического выполнения. Готовы избавиться от рутины и вывести свою продуктивность на новый уровень? Продолжайте чтение — я поделюсь скриптами, которые меняют правила игры. 🚀

Осваиваете скрипты в Linux и думаете о расширении своих навыков? Обучение Python-разработке от Skypro — естественный шаг вперёд для системных администраторов. Python идеально дополняет bash, позволяя создавать более сложные и масштабируемые решения для автоматизации. Курс предлагает практико-ориентированный подход: вы сразу применяете знания для решения реальных задач администрирования и мониторинга систем.

Основы скриптов bash в Linux: время автоматизировать

Bash-скрипты — это последовательности команд, которые интерпретатор командной строки bash выполняет так, словно они были введены вручную. Однако вместо многократного набора одних и тех же команд, вы запускаете файл, содержащий эти инструкции. Простая концепция с революционным эффектом для продуктивности.

Каждый bash-скрипт начинается с шебанга — специальной строки, указывающей системе, какой интерпретатор использовать:

#!/bin/bash

Для создания базового скрипта достаточно выполнить следующие шаги:

  1. Создать текстовый файл с расширением .sh (например, myscript.sh)
  2. Добавить шебанг в первую строку
  3. Написать необходимые команды
  4. Сделать файл исполняемым: chmod +x myscript.sh
  5. Запустить скрипт: ./myscript.sh

Вот пример простейшего скрипта, который выводит информацию о системе:

#!/bin/bash
echo "Привет, $(whoami)!"
echo "Сегодня $(date)"
echo "Информация о системе:"
uname -a
echo "Использование диска:"
df -h

Эффективность bash-скриптов раскрывается через использование переменных, условных конструкций и циклов. Например, переменные объявляются просто:

USERNAME="admin"
echo "Привет, $USERNAME"

Условные конструкции позволяют принимать решения:

if [ $DISK_USAGE -gt 90 ]; then
  echo "Предупреждение: диск заполнен более чем на 90%"
fi

А циклы автоматизируют повторяющиеся действия:

for SERVER in server1 server2 server3; do
  ssh $SERVER "uptime"
done

Конструкция Назначение Пример использования
if/else Условное выполнение Проверка доступности сервиса
for Итерация по списку Обработка файлов в директории
while Выполнение, пока условие истинно Ожидание завершения процесса
case Множественный выбор Обработка аргументов командной строки

Александр Петров, DevOps-инженер

Однажды мне поручили настройку 50 новых серверов для проекта с жесткими сроками запуска. Ручная настройка каждого заняла бы дни. Я написал bash-скрипт, который автоматически устанавливал необходимые пакеты, настраивал сетевые интерфейсы, конфигурировал службы и добавлял системы мониторинга. Скрипт включал проверки успешности каждой операции и логировал результаты.

Развертывание всей инфраструктуры заняло 3 часа вместо планируемых 2-3 дней. Клиент был в восторге, а я получил повышение. Этот случай убедил меня в необходимости автоматизировать абсолютно всё, что выполняется более одного раза.

Пошаговый план для смены профессии

Управление файлами: скрипты bash для работы с данными

Управление файлами — одна из самых распространенных задач системного администратора. Bash предоставляет мощные инструменты для работы с файлами и каталогами, которые можно объединить в эффективные скрипты. 📂

Вот скрипт для организации файлов по типам, который автоматически сортирует файлы в указанной директории по расширениям:

#!/bin/bash

SOURCE_DIR="$1"
if [ -z "$SOURCE_DIR" ]; then
    SOURCE_DIR="."
fi

# Создаем директории для разных типов файлов
mkdir -p "$SOURCE_DIR/images" "$SOURCE_DIR/documents" "$SOURCE_DIR/videos" "$SOURCE_DIR/archives" "$SOURCE_DIR/other"

# Перемещаем файлы по соответствующим директориям
find "$SOURCE_DIR" -maxdepth 1 -type f | while read file; do
    case "$file" in
        *.jpg|*.jpeg|*.png|*.gif|*.bmp)
            mv "$file" "$SOURCE_DIR/images/"
            ;;
        *.doc|*.docx|*.txt|*.pdf|*.odt)
            mv "$file" "$SOURCE_DIR/documents/"
            ;;
        *.mp4|*.avi|*.mov|*.mkv)
            mv "$file" "$SOURCE_DIR/videos/"
            ;;
        *.zip|*.tar|*.gz|*.rar)
            mv "$file" "$SOURCE_DIR/archives/"
            ;;
        *)
            # Игнорируем сам скрипт
            if [ "$file" != "./$0" ]; then
                mv "$file" "$SOURCE_DIR/other/"
            fi
            ;;
    esac
done

echo "Файлы успешно отсортированы!"

Для поиска дубликатов файлов можно использовать следующий скрипт:

#!/bin/bash

DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
    DIRECTORY="."
fi

echo "Поиск дубликатов в $DIRECTORY..."
find "$DIRECTORY" -type f -exec md5sum {} \; | sort | uniq -w32 -d --all-repeated=separate

А этот скрипт массово переименовывает файлы, заменяя пробелы на подчеркивания:

#!/bin/bash

DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
    DIRECTORY="."
fi

find "$DIRECTORY" -type f -name "* *" | while read file; do
    newname=$(echo "$file" | tr ' ' '_')
    if [ "$file" != "$newname" ]; then
        mv "$file" "$newname"
        echo "Переименован: $file -> $newname"
    fi
done

Один из моих любимых скриптов — очистка директории от старых файлов:

#!/bin/bash

DIRECTORY="$1"
DAYS="$2"

if [ -z "$DIRECTORY" ] || [ -z "$DAYS" ]; then
    echo "Использование: $0 <директория> <количество_дней>"
    exit 1
fi

echo "Удаление файлов старше $DAYS дней из $DIRECTORY..."
find "$DIRECTORY" -type f -mtime +$DAYS -exec rm {} \;
echo "Готово!"

Для анализа размера директорий можно использовать:

#!/bin/bash

DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
    DIRECTORY="."
fi

echo "Топ 10 самых больших директорий в $DIRECTORY:"
du -h --max-depth=1 "$DIRECTORY" | sort -hr | head -n 10

  • Преимущества автоматизации файловых операций: – Сокращение времени на рутинные операции – Минимизация человеческих ошибок – Возможность запуска по расписанию (через cron) – Единообразная обработка файлов – Возможность легко масштабировать операции на большое количество файлов

Мониторинг системы: bash-скрипты для контроля ресурсов

Мониторинг — критически важный аспект администрирования Linux-систем. Своевременное обнаружение проблем с ресурсами может предотвратить сбои в работе сервисов. Bash-скрипты позволяют создать простые, но эффективные системы мониторинга. 📊

Вот универсальный скрипт для мониторинга основных параметров системы:

#!/bin/bash

LOG_FILE="/var/log/system_monitor.log"
MAIL_TO="admin@example.com"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# Проверка использования CPU
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')

# Проверка использования ОЗУ
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')
MEMORY_FREE=$(free -m | awk 'NR==2{print $4}')

# Проверка использования диска
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}')
DISK_FREE=$(df -h / | awk 'NR==2{print $4}')

# Проверка загрузки системы
LOAD=$(uptime | awk -F'[a-z]:' '{ print $2}' | sed 's/,//g')

# Запись в лог
echo "$DATE – CPU: $CPU_USAGE%, RAM: $MEMORY_USAGE (Free: $MEMORY_FREE MB), Disk: $DISK_USAGE (Free: $DISK_FREE), Load: $LOAD" >> $LOG_FILE

# Проверка на превышение пороговых значений
if (( $(echo "$CPU_USAGE > 80" | bc -l) )) || [[ ${DISK_USAGE%?} -gt 90 ]] || [[ ${MEMORY_USAGE%?} -gt 90 ]]; then
    echo "ALERT: High resource usage on $HOSTNAME at $DATE
CPU: $CPU_USAGE%
RAM: $MEMORY_USAGE (Free: $MEMORY_FREE MB)
Disk: $DISK_USAGE (Free: $DISK_FREE)
Load: $LOAD" | mail -s "System Alert: High Resource Usage on $HOSTNAME" $MAIL_TO
fi

Для мониторинга работоспособности критичных сервисов подойдет такой скрипт:

#!/bin/bash

# Список сервисов для проверки
SERVICES=("nginx" "mysql" "apache2" "postgresql" "ssh")
LOG_FILE="/var/log/service_monitor.log"
MAIL_TO="admin@example.com"

check_service() {
    local service=$1
    systemctl is-active $service >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') – КРИТИЧЕСКАЯ ОШИБКА: Сервис $service не запущен!" >> $LOG_FILE
        echo "Сервис $service на сервере $(hostname) не запущен! Требуется вмешательство." | mail -s "ALERT: $service DOWN on $(hostname)" $MAIL_TO
        
        # Попытка перезапуска сервиса
        systemctl restart $service
        if [ $? -eq 0 ]; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service успешно перезапущен" >> $LOG_FILE
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') – ОШИБКА: Не удалось перезапустить сервис $service!" >> $LOG_FILE
        fi
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service работает нормально" >> $LOG_FILE
    fi
}

for service in "${SERVICES[@]}"; do
    if systemctl list-unit-files | grep -q "$service"; then
        check_service $service
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service не установлен на этой системе" >> $LOG_FILE
    fi
done

Для мониторинга сетевых подключений и выявления аномальной активности:

#!/bin/bash

LOG_FILE="/var/log/network_monitor.log"
THRESHOLD=100 # Порог числа подключений для уведомления

echo "=== Проверка сетевых подключений $(date) ===" >> $LOG_FILE

# Подсчет активных соединений по портам
echo "Топ 10 портов по числу соединений:" >> $LOG_FILE
netstat -ant | awk '{print $4}' | grep -o ":[0-9]\+" | cut -d: -f2 | sort | uniq -c | sort -nr | head -n 10 >> $LOG_FILE

# Проверка числа соединений в состоянии ESTABLISHED
ESTABLISHED=$(netstat -ant | grep ESTABLISHED | wc -l)
echo "Количество установленных соединений: $ESTABLISHED" >> $LOG_FILE

# Проверка числа соединений в состоянии CLOSE_WAIT
CLOSE_WAIT=$(netstat -ant | grep CLOSE_WAIT | wc -l)
echo "Количество соединений в состоянии CLOSE_WAIT: $CLOSE_WAIT" >> $LOG_FILE

# Проверка на подозрительно большое число соединений
if [ $ESTABLISHED -gt $THRESHOLD ] || [ $CLOSE_WAIT -gt $THRESHOLD ]; then
    echo "ВНИМАНИЕ: Обнаружено большое количество соединений!" >> $LOG_FILE
    
    # Вывод информации о подозрительных соединениях
    echo "Подробная информация о соединениях:" >> $LOG_FILE
    netstat -anp | head -n 50 >> $LOG_FILE
    
    # Здесь можно добавить отправку уведомления
fi

Параметр мониторинга Команда для проверки Безопасный порог Критический порог
Использование CPU top -bn1 grep "Cpu(s)" < 70% > 90%
Использование ОЗУ free -m < 75% > 90%
Использование диска df -h / < 80% > 95%
Средняя загрузка (Load Average) uptime < число ядер > 2 * число ядер
IOWAIT iostat < 10% > 25%

Одним из наиболее полезных скриптов для повседневного мониторинга является комплексный анализ производительности:

#!/bin/bash

echo "==== Анализ производительности системы ===="
echo "Дата: $(date)"
echo "Хост: $(hostname)"
echo

echo "--- Общая информация ---"
uptime
echo

echo "--- Загрузка CPU ---"
mpstat 1 5
echo

echo "--- Топ процессов по CPU ---"
ps aux --sort=-%cpu | head -n 6
echo

echo "--- Использование памяти ---"
free -m
echo

echo "--- Топ процессов по памяти ---"
ps aux --sort=-%mem | head -n 6
echo

echo "--- Использование диска ---"
df -h
echo

echo "--- Активность диска ---"
iostat -dx 1 5
echo

echo "--- Сетевая активность ---"
netstat -s | grep -E 'segments received|segments send'
echo

echo "--- Открытые порты ---"
ss -tuln
echo

echo "=== Анализ завершен ==="

Резервное копирование: автоматизация с помощью bash

Михаил Сорокин, Системный администратор

Ночь пятницы. Я готовился к заслуженным выходным, когда раздался звонок от директора по развитию. Их команда случайно удалила каталог с данными за три месяца работы — проект находился на грани срыва.

Я мог бы паниковать, но за месяц до этого настроил автоматическое инкрементное резервное копирование с помощью bash-скрипта. Скрипт каждую ночь упаковывал изменившиеся данные, шифровал их и отправлял на удаленное хранилище. Более того, каждое воскресенье делался полный бэкап.

Я зашел на сервер резервных копий, нашел последний инкрементный архив и восстановил данные за 15 минут. Директор был в шоке, команда — в восторге. С тех пор скрипты резервного копирования я внедрил во всех проектах компании. Это был тот случай, когда несколько часов работы над автоматизацией спасли недели труда целой команды.

Резервное копирование — фундаментальный аспект управления системами. Bash-скрипты делают этот процесс надежным и полностью автоматизированным. 💾

Вот скрипт для создания полного резервного копирования директории с датированием и ротацией:

#!/bin/bash

# Конфигурация
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/backup/www"
MAX_BACKUPS=7  # Хранить не более 7 резервных копий
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/www_backup_$DATE.tar.gz"
LOG_FILE="/var/log/backup.log"

# Создаем директорию для резервных копий, если она не существует
mkdir -p $BACKUP_DIR

# Запись в лог
echo "$(date): Начало резервного копирования $SOURCE_DIR в $BACKUP_FILE" >> $LOG_FILE

# Создание резервной копии
tar -czf $BACKUP_FILE $SOURCE_DIR

# Проверка результата
if [ $? -eq 0 ]; then
    echo "$(date): Резервное копирование успешно завершено" >> $LOG_FILE
    
    # Удаление старых резервных копий
    ls -1t $BACKUP_DIR/www_backup_*.tar.gz | tail -n +$((MAX_BACKUPS+1)) | xargs -r rm
    echo "$(date): Старые резервные копии удалены, оставлено последних $MAX_BACKUPS" >> $LOG_FILE
else
    echo "$(date): ОШИБКА при создании резервной копии!" >> $LOG_FILE
fi

# Вывод статистики
BACKUP_SIZE=$(du -h $BACKUP_FILE | cut -f1)
echo "$(date): Размер резервной копии: $BACKUP_SIZE" >> $LOG_FILE
echo "$(date): Список актуальных резервных копий:" >> $LOG_FILE
ls -lh $BACKUP_DIR | grep www_backup | tail -n $MAX_BACKUPS >> $LOG_FILE
echo "------------------------------------" >> $LOG_FILE

Для создания инкрементных резервных копий, сохраняющих только изменения с последнего бэкапа:

#!/bin/bash

# Конфигурация
SOURCE_DIR="/home/user/documents"
BACKUP_DIR="/backup/incremental"
LAST_BACKUP_FILE="$BACKUP_DIR/last_backup.tar.gz"
SNAPSHOT_DIR="$BACKUP_DIR/snapshots"
LAST_SNAPSHOT="$SNAPSHOT_DIR/last_snapshot.dat"
CURRENT_SNAPSHOT="$SNAPSHOT_DIR/snapshot_$(date +"%Y%m%d").dat"
LOG_FILE="/var/log/incremental_backup.log"

# Создание необходимых директорий
mkdir -p $BACKUP_DIR $SNAPSHOT_DIR

# Запись в лог
echo "$(date): Начало инкрементного резервного копирования $SOURCE_DIR" >> $LOG_FILE

# Если это первое резервное копирование
if [ ! -f "$LAST_SNAPSHOT" ]; then
    echo "$(date): Создание полного резервного копирования (первый запуск)" >> $LOG_FILE
    
    # Создание снимка текущего состояния
    find $SOURCE_DIR -type f -print0 | xargs -0 sha1sum > $CURRENT_SNAPSHOT
    
    # Создание полного бэкапа
    tar -czf "$BACKUP_DIR/full_backup_$(date +"%Y%m%d").tar.gz" $SOURCE_DIR
    
    # Копирование снимка как последний
    cp $CURRENT_SNAPSHOT $LAST_SNAPSHOT
    
    echo "$(date): Полное резервное копирование завершено" >> $LOG_FILE
    exit 0
fi

# Создание снимка текущего состояния
find $SOURCE_DIR -type f -print0 | xargs -0 sha1sum > $CURRENT_SNAPSHOT

# Нахождение измененных файлов
CHANGED_FILES=$(diff $LAST_SNAPSHOT $CURRENT_SNAPSHOT | grep ">" | awk '{print $3}')

# Если нет изменений
if [ -z "$CHANGED_FILES" ]; then
    echo "$(date): Изменений не обнаружено, резервное копирование не требуется" >> $LOG_FILE
    exit 0
fi

# Создание временного файла со списком изменений
TEMP_FILE=$(mktemp)
echo "$CHANGED_FILES" > $TEMP_FILE

# Создание инкрементного бэкапа
INCREMENTAL_BACKUP="$BACKUP_DIR/incremental_$(date +"%Y%m%d_%H%M%S").tar.gz"
tar -czf $INCREMENTAL_BACKUP -T $TEMP_FILE

# Очистка
rm $TEMP_FILE

# Обновление последнего снимка
cp $CURRENT_SNAPSHOT $LAST_SNAPSHOT

echo "$(date): Инкрементное резервное копирование завершено. Создан файл $INCREMENTAL_BACKUP" >> $LOG_FILE
echo "$(date): Количество измененных файлов: $(echo "$CHANGED_FILES" | wc -l)" >> $LOG_FILE

Для автоматического резервного копирования базы данных MySQL/MariaDB:

#!/bin/bash

# Конфигурация
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y-%m-%d")
MYSQLDUMP_OPTS="--single-transaction --quick --lock-tables=false"
LOG_FILE="/var/log/mysql_backup.log"

# Создание директории для бэкапов
mkdir -p $BACKUP_DIR

# Запись в лог
echo "$(date): Начало резервного копирования баз данных MySQL" >> $LOG_FILE

# Получение списка всех баз данных, исключая системные
databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")

# Резервное копирование каждой базы данных
for db in $databases; do
    # Имя файла бэкапа
    BACKUP_FILE="$BACKUP_DIR/${db}_${DATE}.sql.gz"
    
    echo "$(date): Создание резервной копии базы данных $db" >> $LOG_FILE
    
    # Создание бэкапа и сжатие на лету
    mysqldump -u$DB_USER -p$DB_PASS $MYSQLDUMP_OPTS $db | gzip > $BACKUP_FILE
    
    if [ $? -eq 0 ]; then
        echo "$(date): Резервное копирование базы данных $db успешно завершено" >> $LOG_FILE
        # Установка прав доступа
        chmod 600 $BACKUP_FILE
    else
        echo "$(date): ОШИБКА при создании резервной копии базы данных $db!" >> $LOG_FILE
    fi
done

# Удаление бэкапов старше 30 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "$(date): Удалены резервные копии старше 30 дней" >> $LOG_FILE
echo "$(date): Резервное копирование баз данных MySQL завершено" >> $LOG_FILE

Интегрируйте эти скрипты с cron для полной автоматизации процесса резервного копирования:

  • Ежедневное инкрементное резервирование: 0 1 * /path/to/incremental_backup.sh
  • Еженедельное полное резервирование: 0 2 0 /path/to/full_backup.sh
  • Ежедневное резервирование базы данных: 0 3 * /path/to/mysql_backup.sh

Оптимизация рабочего процесса: продвинутые скрипты bash

Продвинутые скрипты bash способны существенно оптимизировать рабочий процесс, позволяя автоматизировать комплексные задачи и интегрировать различные системы. Рассмотрим несколько мощных примеров, которые поднимут ваш уровень автоматизации. 🔄

Вот скрипт для автоматического развертывания веб-приложения:

#!/bin/bash

# Конфигурация
APP_NAME="myapp"
GIT_REPO="git@github.com:username/repo.git"
DEPLOY_DIR="/var/www/$APP_NAME"
BACKUP_DIR="/backup/deployments"
LOG_FILE="/var/log/deployment.log"
SLACK_WEBHOOK="https://hooks.slack.com/services/your/webhook/url"

# Функция для отправки уведомлений в Slack
send_notification() {
    local message="$1"
    local status="$2" # success или failure
    
    curl -s -X POST --data-urlencode "payload={\"text\": \"$message\", \"username\": \"DeployBot\", \"icon_emoji\": \":rocket:\"}" $SLACK_WEBHOOK
}

# Логирование
log() {
    local message="$1"
    echo "$(date '+%Y-%m-%d %H:%M:%S') – $message" >> $LOG_FILE
    echo "$message"
}

# Начало развертывания
log "Начало развертывания $APP_NAME из репозитория $GIT_REPO"
send_notification "🚀 Начато развертывание $APP_NAME" "success"

# Создание резервной копии текущей версии
if [ -d "$DEPLOY_DIR" ]; then
    BACKUP_FILE="$BACKUP_DIR/${APP_NAME}_$(date +"%Y%m%d_%H%M%S").tar.gz"
    mkdir -p $BACKUP_DIR
    log "Создание резервной копии текущей версии в $BACKUP_FILE"
    tar -czf $BACKUP_FILE $DEPLOY_DIR
    
    if [ $? -ne 0 ]; then
        log "ОШИБКА: Не удалось создать резервную копию!"
        send_notification "❌ Ошибка развертывания $APP_NAME: сбой при создании резервной копии" "failure"
        exit 1
    fi
fi

# Клонирование репозитория во временную директорию
TEMP_DIR=$(mktemp -d)
log "Клонирование репозитория во временную директорию $TEMP_DIR"
git clone $GIT_REPO $TEMP_DIR

if [ $? -ne 0 ]; then
    log "ОШИБКА: Не удалось клонировать репозиторий!"
    send_notification "❌ Ошибка развертывания $APP_NAME: сбой при клонировании репозитория" "failure"
    rm -rf $TEMP_DIR
    exit 1
fi

# Запуск тестов
log "Запуск тестов"
cd $TEMP_DIR
if [ -f "./run_tests.sh" ]; then
    bash ./run_tests.sh
    if [ $? -ne 0 ]; then
        log "ОШИБКА: Тесты не пройдены!"
        send_notification "❌ Ошибка развертывания $APP_NAME: тесты не пройдены" "failure"
        rm -rf $TEMP_DIR
        exit 1
    fi
fi

# Сборка проекта (если требуется)
if [ -f "./build.sh" ]; then
    log "Запуск процесса сборки"
    bash ./build.sh
    if [ $? -ne 0 ]; then
        log "ОШИБКА: Сборка не удалась!"
        send_notification "❌ Ошибка развертывания $APP_NAME: сборка не удалась" "failure"
        rm -rf $TEMP_DIR
        exit 1
    fi
fi

# Обновление кода
log "Обновление кода в $DEPLOY_DIR"
mkdir -p $DEPLOY_DIR
rsync -av --delete $TEMP_DIR/ $DEPLOY_DIR/ --exclude='.git'

if [ $? -ne 0 ]; then
    log "ОШИБКА: Не удалось обновить код!"
    send_notification "❌ Ошибка развертывания $APP_NAME: не удалось обновить код" "failure"
    rm -rf $TEMP_DIR
    exit 1
fi

# Обновление зависимостей
if [ -f "$DEPLOY_DIR/requirements.txt" ]; then
    log "Обновление Python зависимостей"
    pip install -r $DEPLOY_DIR/requirements.txt
elif [ -f "$DEPLOY_DIR/package.json" ]; then
    log "Обновление Node.js зависимостей"
    cd $DEPLOY_DIR && npm install
fi

# Перезапуск сервисов
log "Перезапуск сервисов"
if [ -f "$DEPLOY_DIR/restart.sh" ]; then
    bash $DEPLOY_DIR/restart.sh
else
    # Стандартный перезапуск для популярных сервисов
    systemctl restart nginx
    [ -f "/etc/systemd/system/$APP_NAME.service" ] && systemctl restart $APP_NAME
fi

# Очистка
rm -rf $TEMP_DIR

# Завершение
log "Развертывание $APP_NAME успешно завершено"
send_notification "✅ Развертывание $APP_NAME успешно завершено" "success"

Скрипт для автоматического обновления системы с проверкой и уведомлением:

#!/bin/bash

LOG_FILE="/var/log/system_update.log"
EMAIL="admin@example.com"
HOSTNAME=$(hostname)

# Функция для логирования
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') – $1" >> $LOG_FILE
}

log "Начало процесса обновления системы"

# Проверка, запущен ли скрипт от имени root
if [ "$(id -u)" != "0" ]; then
   log "Этот скрипт должен быть запущен от имени root"
   exit 1
fi

# Создание снимка системы перед обновлением (если используется LVM)
if command -v lvcreate &> /dev/null && lvs | grep -q "root"; then
    log "Создание LVM-снимка перед обновлением"
    SNAPSHOT_NAME="rootvol_snapshot_$(date +%Y%m%d%H%M)"
    lvcreate -L 2G -s -n $SNAPSHOT_NAME /dev/mapper/vg-root
    if [ $? -eq 0 ]; then
        log "LVM-снимок $SNAPSHOT_NAME успешно создан"
    else
        log "ОШИБКА: Не удалось создать LVM-снимок"
    fi
fi

# Обновление списка пакетов
log "Обновление списка пакетов"
apt-get update
if [ $? -ne 0 ]; then
    log "ОШИБКА: Не удалось обновить список пакетов"
    echo "Ошибка обновления списка пакетов на сервере $HOSTNAME" | mail -s "Ошибка обновления системы на $HOSTNAME" $EMAIL
    exit 1
fi

# Получение списка пакетов, которые будут обновлены
UPDATES=$(apt-get -s upgrade | grep -P '^Inst' | wc -l)
SECURITY_UPDATES=$(apt-get -s upgrade | grep -P '^Inst.*security' | wc -l)

log "Доступно обновлений: $UPDATES (из них обновлений безопасности: $SECURITY_UPDATES)"

if [ $UPDATES -eq 0 ]; then
    log "Нет доступных обновлений. Завершение работы."
    exit 0
fi

# Создание списка пакетов для обновления
PACKAGE_LIST=$(apt-get -s upgrade | grep -P '^Inst' | awk '{print $2}')
log "Список пакетов для обновления:<br>$PACKAGE_LIST"

# Обновление системы
log "Начало процесса обновления пакетов"
apt-get -y upgrade

if [ $? -ne 0 ]; then
    log "ОШИБКА: Процесс обновления завершился с ошибками"
    echo "Ошибка при обновлении системы на сервере $HOSTNAME" | mail -s "Ошибка обновления системы на $HOSTNAME" $EMAIL
    exit 1
fi

# Проверка необходимости перезагрузки
if [ -f /var/run/reboot-required ]; then
    log "Требуется перезагрузка системы"
    echo "Система $HOSTNAME обновлена, но требуется перезагрузка." | mail -s "Обновление системы $HOSTNAME: требуется перезагрузка" $EMAIL
else
    log "Перезагрузка системы не требуется"
    echo "Система $HOSTNAME успешно обновлена. Установлено $UPDATES обновлений (из них $SECURITY_UPDATES обновлений безопасности)." | mail -s "Система $HOSTNAME успешно обновлена" $EMAIL
fi

# Очистка
log "Удаление ненужных пакетов"
apt-get -y autoremove
apt-get -y autoclean

log "Процесс обновления системы успешно завершен"

Скрипты bash превосходны для создания комплексных сценариев автоматизации, которые охватывают несколько систем и сервисов. Вот примеры задач, которые можно эффективно автоматизировать:

  • Автоматическое развертывание приложений с настройкой окружения
  • Обновление множества серверов с контролем процесса
  • Интеграция с системами CI/CD для автоматической доставки обновлений
  • Создание комплексных систем мониторинга и оповещения
  • Автоматизированное тестирование инфраструктуры и безопасности
  • Миграция данных между системами с валидацией результатов

Для оптимизации рабочих процессов рекомендую следующие практики:

  1. Разделяйте скрипты на модули для повторного использования функций
  2. Используйте версионный контроль для скриптов (Git)
  3. Документируйте назначение и параметры скриптов
  4. Добавляйте логирование и механизмы обработки ошибок
  5. Внедряйте механизмы уведомления об успешном/неуспешном выполнении

Использование скриптов bash для автоматизации рутинных задач — не просто экономия времени, а полноценная стратегия управления инфраструктурой. Автоматизация минимизирует человеческие ошибки, обеспечивает стабильность работы систем и позволяет вам сосредоточиться на действительно важных задачах. Помните: если вы делаете что-то более двух раз — это кандидат на автоматизацию. Превратите скрипты в свою суперсилу, и ваша система будет работать как отлаженный механизм, требующий минимума вмешательства.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что делает команда 'set -e' в Bash скриптах?
1 / 5

Загрузка...