13 Bash скрипта, които всеки начинаещ DevOps ентусиаст трябва да използва

13 Bash скрипта, които всеки начинаещ DevOps ентусиаст трябва да използва

Когато започнах пътуването си в DevOps света, една от първите неща, които разбрах, беше това: автоматизацията е всичко. Bash скриптовете са основата на тази автоматизация. Те са като швейцарско ножче за системните администратори и DevOps инженерите.

В тази статия ще споделя 13 практични Bash скрипта. Всеки от тях ще ви спести часове работа и ще подобри ефективността ви. Тези скриптове са проверени в реални проекти и са подходящи за ежедневна употреба.

Защо Bash скриптовете са толкова важни в DevOps?

Bash е навсякъде в Linux и Unix системите. Той е лесен за изучаване и мощен едновременно. За DevOps професионалистите Bash скриптовете са като дишането – нещо естествено и необходимо.

Ето защо трябва да ги овладеете:

  • Скорост: Автоматизират повтарящи се задачи
  • Надеждност: Намаляват човешките грешки
  • Гъвкавост: Работят на всички Unix-подобни системи
  • Икономия: Спестяват време и ресурси

Нека започнем с практическите примери.

1. Скрипт за проверка на системното състояние

Първият скрипт е като лекарски преглед за вашия сървър. Той проверява основните показатели за здравето на системата.

#!/bin/bash
# system_health_check.sh

echo "=== СИСТЕМНА ПРОВЕРКА ==="
echo "Дата: $(date)"
echo

# Проверка на използваната памет
echo "=== ПАМЕТ ==="
free -h | grep -E "^Mem"

# Проверка на дисковото пространство
echo -e "\n=== ДИСКОВЕ ==="
df -h | head -n 1
df -h | grep -vE '^Filesystem|tmpfs|cdrom'

# Проверка на CPU натоварването
echo -e "\n=== CPU НАТОВАРВАНЕ ==="
uptime

# Топ 5 процеса по CPU
echo -e "\n=== ТОП ПРОЦЕСИ ==="
ps aux | head -n 1
ps aux | sort -rn -k 3 | head -n 5

echo -e "\n=== МРЕЖА ==="
ss -tuln | wc -l | xargs echo "Активни мрежови връзки:"

Този скрипт ви дава бърз преглед на състоянието на сървъра. Използвайте го всеки ден като първа проверка.

2. Автоматично архивиране на файлове

Архивирането е критично за всеки DevOps процес. Този скрипт създава архиви със времева печат.

#!/bin/bash
# backup_files.sh

SOURCE_DIR="$1"
BACKUP_DIR="$2"

if [ $# -ne 2 ]; then
    echo "Използване: $0 <източник> <архив_директория>"
    exit 1
fi

# Създаване на архивна директория ако не съществува
mkdir -p "$BACKUP_DIR"

# Генериране на име с времева печат
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${TIMESTAMP}.tar.gz"

# Създаване на архив
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" -C "$(dirname $SOURCE_DIR)" "$(basename $SOURCE_DIR)"

if [ $? -eq 0 ]; then
    echo "Архивът е създаден успешно: ${BACKUP_DIR}/${BACKUP_NAME}"
    ls -lh "${BACKUP_DIR}/${BACKUP_NAME}"
else
    echo "Грешка при създаване на архива!"
    exit 1
fi

Използвайте го така: ./backup_files.sh /path/to/source /path/to/backups

3. Мониториране на дискового пространство

Този скрипт следи дисковото пространство и изпраща предупреждения.

#!/bin/bash
# disk_monitor.sh

THRESHOLD=80
EMAIL="[email protected]"

# Проверка на всички файлови системи
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read line; do
    USAGE=$(echo $line | awk '{print $1}' | sed 's/%//g')
    PARTITION=$(echo $line | awk '{print $2}')
    
    if [ $USAGE -ge $THRESHOLD ]; then
        echo "ПРЕДУПРЕЖДЕНИЕ: $PARTITION използва ${USAGE}% от пространството!"
        
        # Изпращане на email (опционално)
        # echo "Дискът $PARTITION е $USAGE% пълен!" | mail -s "Disk Alert" $EMAIL
    fi
done

Добавете този скрипт в cron за автоматично мониториране:

# Проверка всеки час
0 * * * * /path/to/disk_monitor.sh

4. Управление на процеси

Този скрипт ви помага да управлявате процеси по име или PID.

#!/bin/bash
# process_manager.sh

ACTION="$1"
PROCESS_NAME="$2"

case $ACTION in
    "start")
        echo "Стартиране на $PROCESS_NAME..."
        systemctl start "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" start
        ;;
    "stop")
        echo "Спиране на $PROCESS_NAME..."
        systemctl stop "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" stop
        ;;
    "restart")
        echo "Рестартиране на $PROCESS_NAME..."
        systemctl restart "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" restart
        ;;
    "status")
        systemctl status "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" status
        ;;
    "kill")
        echo "Принудително спиране на процеси съдържащи: $PROCESS_NAME"
        pkill -f "$PROCESS_NAME"
        ;;
    *)
        echo "Използване: $0 {start|stop|restart|status|kill} <име_на_процес>"
        exit 1
        ;;
esac

5. Проверка на мрежова свързаност

Мрежовите проблеми са често срещани. Този скрипт тества свързаността с множество хостове.

#!/bin/bash
# network_check.sh

HOSTS=("google.com" "github.com" "stackoverflow.com" "8.8.8.8")
LOG_FILE="/tmp/network_check.log"

echo "Проверка на мрежовата свързаност - $(date)" | tee -a $LOG_FILE

for host in "${HOSTS[@]}"; do
    if ping -c 3 -W 5 "$host" &> /dev/null; then
        echo "✅ $host - достъпен" | tee -a $LOG_FILE
    else
        echo "❌ $host - недостъпен" | tee -a $LOG_FILE
    fi
done

echo "Проверката завърши - $(date)" | tee -a $LOG_FILE
echo "Подробности в: $LOG_FILE"

6. Почистване на системни файлове

Този скрипт освобождава място чрез изтриване на временни и ненужни файлове.

#!/bin/bash
# system_cleanup.sh

echo "Започване на системно почистване..."

# Получаване на първоначално свободно място
INITIAL_SPACE=$(df / | awk 'NR==2 {print $4}')

# Почистване на APT cache (Ubuntu/Debian)
if command -v apt &> /dev/null; then
    echo "Почистване на APT cache..."
    sudo apt autoremove -y
    sudo apt autoclean
fi

# Почистване на YUM cache (RHEL/CentOS)
if command -v yum &> /dev/null; then
    echo "Почистване на YUM cache..."
    sudo yum clean all
fi

# Изтриване на стари log файлове
echo "Почистване на log файлове..."
find /var/log -name "*.log" -type f -mtime +30 -delete 2>/dev/null
find /var/log -name "*.gz" -type f -mtime +30 -delete 2>/dev/null

# Почистване на temp директории
echo "Почистване на временни файлове..."
rm -rf /tmp/*
rm -rf /var/tmp/*

# Калкулиране на освободеното място
FINAL_SPACE=$(df / | awk 'NR==2 {print $4}')
FREED_SPACE=$((FINAL_SPACE - INITIAL_SPACE))

echo "Почистването завърши!"
echo "Освободени: $(($FREED_SPACE / 1024)) MB"

7. Мониториране на услуги

Този скрипт проверява дали критичните услуги работят правилно.

#!/bin/bash
# service_monitor.sh

SERVICES=("nginx" "mysql" "ssh" "docker")
LOG_FILE="/var/log/service_monitor.log"

check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "$(date): ✅ $service работи" >> $LOG_FILE
        return 0
    else
        echo "$(date): ❌ $service не работи!" >> $LOG_FILE
        
        # Опит за автоматичен рестарт
        echo "$(date): Опит за рестарт на $service..." >> $LOG_FILE
        systemctl restart "$service"
        
        sleep 5
        
        if systemctl is-active --quiet "$service"; then
            echo "$(date): ✅ $service е рестартиран успешно" >> $LOG_FILE
        else
            echo "$(date): ❌ Неуспешен рестарт на $service!" >> $LOG_FILE
            # Тук може да добавите изпращане на email или друго уведомление
        fi
    fi
}

echo "$(date): Започване на проверка на услуги" >> $LOG_FILE

for service in "${SERVICES[@]}"; do
    check_service "$service"
done

echo "$(date): Проверката завърши" >> $LOG_FILE

8. Синхронизиране на файлове

Този скрипт синхронизира файлове между директории или сървъри.

#!/bin/bash
# sync_files.sh

SOURCE="$1"
DESTINATION="$2"
LOG_FILE="/var/log/sync.log"

if [ $# -ne 2 ]; then
    echo "Използване: $0 <източник> <дестинация>"
    echo "Примери:"
    echo "  $0 /local/dir/ user@server:/remote/dir/"
    echo "  $0 /dir1/ /dir2/"
    exit 1
fi

echo "$(date): Започване на синхронизация" >> $LOG_FILE
echo "Източник: $SOURCE" >> $LOG_FILE
echo "Дестинация: $DESTINATION" >> $LOG_FILE

# Използване на rsync за ефективна синхронизация
rsync -avz --delete --progress "$SOURCE" "$DESTINATION" 2>&1 | tee -a $LOG_FILE

if [ ${PIPESTATUS[0]} -eq 0 ]; then
    echo "$(date): Синхронизацията завърши успешно" >> $LOG_FILE
else
    echo "$(date): Грешка при синхронизация!" >> $LOG_FILE
    exit 1
fi

9. Управление на потребители

Този скрипт автоматизира създаването и управлението на потребители.

#!/bin/bash
# user_manager.sh

ACTION="$1"
USERNAME="$2"
PASSWORD="$3"

create_user() {
    local user=$1
    local pass=$2
    
    if id "$user" &>/dev/null; then
        echo "Потребителят $user вече съществува!"
        return 1
    fi
    
    # Създаване на потребител
    useradd -m -s /bin/bash "$user"
    
    # Задаване на парола
    if [ -n "$pass" ]; then
        echo "$user:$pass" | chpasswd
    fi
    
    echo "Потребителят $user е създаден успешно!"
}

delete_user() {
    local user=$1
    
    if ! id "$user" &>/dev/null; then
        echo "Потребителят $user не съществува!"
        return 1
    fi
    
    # Изтриване на потребител и домашна директория
    userdel -r "$user" 2>/dev/null
    echo "Потребителят $user е изтрит!"
}

case $ACTION in
    "create")
        if [ -z "$USERNAME" ]; then
            echo "Използване: $0 create <потребител> [парола]"
            exit 1
        fi
        create_user "$USERNAME" "$PASSWORD"
        ;;
    "delete")
        if [ -z "$USERNAME" ]; then
            echo "Използване: $0 delete <потребител>"
            exit 1
        fi
        delete_user "$USERNAME"
        ;;
    "list")
        echo "Потребители в системата:"
        cut -d: -f1 /etc/passwd | sort
        ;;
    *)
        echo "Използване: $0 {create|delete|list} [потребител] [парола]"
        exit 1
        ;;
esac

10. Мониториране на SSL сертификати

SSL сертификатите изтичат. Този скрипт ви предупреждава предварително.

#!/bin/bash
# ssl_monitor.sh

DOMAINS=("example.com" "api.example.com" "www.example.com")
THRESHOLD_DAYS=30
EMAIL="[email protected]"

check_ssl_cert() {
    local domain=$1
    local expiry_date
    local days_until_expiry
    
    # Получаване на датата на изтичане
    expiry_date=$(openssl s_client -servername "$domain" -connect "$domain:443" </dev/null 2>/dev/null | 
                 openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
    
    if [ -z "$expiry_date" ]; then
        echo "❌ Не може да се провери $domain"
        return 1
    fi
    
    # Калкулиране на дните до изтичане
    expiry_timestamp=$(date -d "$expiry_date" +%s)
    current_timestamp=$(date +%s)
    days_until_expiry=$(( (expiry_timestamp - current_timestamp) / 86400 ))
    
    echo "$domain: $days_until_expiry дни до изтичане"
    
    if [ $days_until_expiry -le $THRESHOLD_DAYS ]; then
        echo "⚠️  ВНИМАНИЕ: $domain изтича след $days_until_expiry дни!"
        # Изпращане на email предупреждение
        # echo "$domain SSL cert expires in $days_until_expiry days" | mail -s "SSL Alert" $EMAIL
    fi
}

echo "Проверка на SSL сертификати - $(date)"
echo "========================================"

for domain in "${DOMAINS[@]}"; do
    check_ssl_cert "$domain"
done

11. Мониториране на база данни

Този скрипт проверява състоянието на MySQL/PostgreSQL база данни.

#!/bin/bash
# database_monitor.sh

DB_TYPE="$1" # mysql или postgresql
DB_HOST="localhost"
DB_USER="monitoring_user"
DB_PASS="password"
LOG_FILE="/var/log/db_monitor.log"

check_mysql() {
    # Проверка на MySQL връзка
    mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SELECT 1;" &>/dev/null
    
    if [ $? -eq 0 ]; then
        echo "$(date): ✅ MySQL е достъпна" >> $LOG_FILE
        
        # Проверка на активни връзки
        connections=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SHOW STATUS LIKE 'Threads_connected';" | awk 'NR==2 {print $2}')
        echo "$(date): Активни връзки: $connections" >> $LOG_FILE
        
        # Проверка на размера на базата
        db_size=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS 'DB Size in MB' FROM information_schema.tables;" | awk 'NR==2 {print $1}')
        echo "$(date): Размер на БД: ${db_size}MB" >> $LOG_FILE
    else
        echo "$(date): ❌ MySQL не е достъпна!" >> $LOG_FILE
    fi
}

check_postgresql() {
    # Проверка на PostgreSQL връзка
    PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -U "$DB_USER" -d postgres -c "SELECT 1;" &>/dev/null
    
    if [ $? -eq 0 ]; then
        echo "$(date): ✅ PostgreSQL е достъпна" >> $LOG_FILE
        
        # Проверка на активни връзки
        connections=$(PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -U "$DB_USER" -d postgres -t -c "SELECT count(*) FROM pg_stat_activity;")
        echo "$(date): Активни връзки: $connections" >> $LOG_FILE
    else
        echo "$(date): ❌ PostgreSQL не е достъпна!" >> $LOG_FILE
    fi
}

case $DB_TYPE in
    "mysql")
        check_mysql
        ;;
    "postgresql")
        check_postgresql
        ;;
    *)
        echo "Използване: $0 {mysql|postgresql}"
        exit 1
        ;;
esac

12. Управление на Git хранилища

Този скрипт автоматизира често срещани Git операции.

#!/bin/bash
# git_manager.sh

REPO_DIR="$1"
ACTION="$2"
BRANCH="${3:-main}"

if [ ! -d "$REPO_DIR" ]; then
    echo "Директорията $REPO_DIR не съществува!"
    exit 1
fi

cd "$REPO_DIR" || exit 1

# Проверка дали е Git хранилище
if [ ! -d ".git" ]; then
    echo "Това не е Git хранилище!"
    exit 1
fi

case $ACTION in
    "status")
        echo "=== Git статус за $REPO_DIR ==="
        git status --short
        echo
        git log --oneline -5
        ;;
    "pull")
        echo "Изтегляне на промени за $REPO_DIR..."
        git pull origin "$BRANCH"
        ;;
    "push")
        echo "Качване на промени за $REPO_DIR..."
        git add -A
        git commit -m "Auto-commit: $(date)"
        git push origin "$BRANCH"
        ;;
    "backup")
        echo "Създаване на архив на $REPO_DIR..."
        BACKUP_NAME="backup_$(basename $REPO_DIR)_$(date +%Y%m%d_%H%M%S).tar.gz"
        tar -czf "../$BACKUP_NAME" .
        echo "Архивът е създаден: ../$BACKUP_NAME"
        ;;
    "clean")
        echo "Почистване на $REPO_DIR..."
        git clean -fd
        git reset --hard HEAD
        ;;
    *)
        echo "Използване: $0 <директория> {status|pull|push|backup|clean} [branch]"
        exit 1
        ;;
esac

13. Централизиран скрипт за мониториране

Този финален скрипт комбинира всички проверки в едно място.

#!/bin/bash
# master_monitor.sh

LOG_DIR="/var/log/monitoring"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="$LOG_DIR/system_report_$TIMESTAMP.log"

# Създаване на log директория
mkdir -p "$LOG_DIR"

# Начало на отчета
{
    echo "========================================"
    echo "СИСТЕМЕН ОТЧЕТ - $(date)"
    echo "========================================"
    echo
    
    # Системна информация
    echo "=== СИСТЕМНА ИНФОРМАЦИЯ ==="
    echo "Hostname: $(hostname)"
    echo "Kernel: $(uname -r)"
    echo "Uptime: $(uptime -p)"
    echo "Load Average: $(uptime | awk -F'load average:' '{print $2}')"
    echo
    
    # Памет и дискове
    echo "=== РЕСУРСИ ==="
    echo "Памет:"
    free -h | grep -E "^Mem|^Swap"
    echo
    echo "Дискове:"
    df -h | grep -vE '^Filesystem|tmpfs|cdrom'
    echo
    
    # Мрежа
    echo "=== МРЕЖА ==="
    echo "Активни връзки: $(ss -tuln | wc -l)"
    echo "Мрежови интерфейси:"
    ip -4 addr show | grep -E "^[0-9]|inet " | grep -v "127.0.0.1"
    echo
    
    # Топ процеси
    echo "=== ТОП 5 ПРОЦЕСА ПО CPU ==="
    ps aux --sort=-%cpu | head -n 6
    echo
    
    # Услуги
    echo "=== КРИТИЧНИ УСЛУГИ ==="
    for service in nginx mysql ssh docker; do
        if systemctl is-active --quiet "$service" 2>/dev/null; then
            echo "✅ $service - работи"
        else
            echo "❌ $service - не работи"
        fi
    done
    echo
    
    # Последни log записи
    echo "=== ПОСЛЕДНИ СИСТЕМНИ СЪОБЩЕНИЯ ==="
    journalctl --since "1 hour ago" --no-pager -n 10
    
    echo "========================================"
    echo "ОТЧЕТЪТ ЗАВЪРШИ - $(date)"
    echo "========================================"
    
} > "$REPORT_FILE"

echo "Системният отчет е запазен в: $REPORT_FILE"

# Изпращане по email (опционално)
# mail -s "System Report $(hostname)" [email protected] < "$REPORT_FILE"

# Почистване на стари отчети (пази последните 7 дни)
find "$LOG_DIR" -name "system_report_*.log" -type f -mtime +7 -delete

Заключение

Тези 13 Bash скрипта са основата на всяка добра DevOps практика. Всеки от тях решава реален проблем и може да се адаптира според вашите нужди.

Препоръчвам ви да:

  1. Започнете с първите 3 скрипта – те са най-универсални
  2. Адаптирайте ги според вашата среда
  3. Тествайте внимателно преди внедряване в продукция
  4. Документирайте промените които правите

Помнете: автоматизацията не е цел, а средство. Целта е да имате повече време за творческа работа и по-малко време за рутинни задачи.

Какъв е следващият ви скрипт? Споделете вашия опит в коментарите и нека се учим заедно!


Статията е написана с цел споделяне на знания и опит в DevOps общността. За въпроси и предложения се свържете с мен.

Федя Серафиев

Федя Серафиев

е DevOps технологичен ентусиаст с опит в Linux, Docker, Kubernetes и CI/CD. Той споделя практични ръководства и анализи, които помагат на специалистите да изграждат по-добри и ефективни системи. На devopsbg.net Федя предоставя актуални и полезни насоки за автоматизация, сигурност и оптимизация на инфраструктурата.

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *


Колко е 7 + 10 ? (въведете числото)